2

我有一个 Rails rake 任务正在处理一批图像。它去除白色背景(使用 RMagick),用透明层替换它,将其写入临时文件,然后将其保存为 Amazon S3 上的 PNG(使用 Paperclip)。

它适用于大部分图像。但是,它遇到了至少 1 张图像的错误。有人可以帮我弄清楚为什么以及如何解决它吗?

代码示例:

require 'RMagick'
require 'tempfile'
include Magick

task :task_name => :environment do
   x = Item.find(128)  # image 128 is the one giving me trouble
   sourceImage = Image.read(x.image_link_hires)
   processedImage = sourceImage[0].transparent("white")

   tempImageFile = Tempfile.new(["processed_image",".png"])
   processedImage.write("png:" + tempImageFile.path)
   x.image_transparent = tempImageFile
   x.save!
end

错误信息:

耙中止!验证失败:图像透明 C:/Users/Roger/AppData/Local/Temp/processed_image20130107-8640-1ck71i820130107-8640-i6p91w.png 无法被“识别”命令识别。图像透明 C:/Users/Roger/AppData “识别”命令无法识别 /Local/Temp/processed_image20130107-8640-1ck71i820130107-8640-i6p91w.png。

此消息在运行最后一行(保存操作)时出现。

小文件的临时文件问题?

我认为该错误与 Tempfile 实际上没有将文件写入临时路径有关。此错误可能与小文件大小有关?它遇到问题的特定图像通常具有大量空白,因此对于 800x800 像素的图像,处理后生成的文件大小约为 30k。

我如何验证是否是这种情况?如果是,我该如何解决?

其他观察:

  1. 当我将故障图像写入普通文件(而不是 Tempfile)时,它会成功保存在本地。
  2. 该任务适用于其他图像,这些图像往往更大(~1-2MB)
  3. 之后processedImage.write,我检查了tempImageFile.size。它说它是预期的30kb。
  4. 当我在 rake 任务运行时观察临时文件目录时,我可以看到任务成功运行其他图像时正在创建的临时文件。文件似乎在processedImage.write运行时出现。但是,对于故障图像,我没有看到任何临时文件被创建。

感谢您的任何建议。

2013 年 1 月 7 日更新

我对此进行了更多调查。我重新运行了上面的#1,但尝试使用 Paperclip 保存到 S3。这产生了相同的错误消息。

所以现在我认为问题在于这是一个字节数(32kb)的小文件,但具有不错的高度和宽度(800x800)。Paperclip 正在尝试保存它的缩略图版本,即 90x90。通常,这会生成小于原始文件大小 1% 的文件大小,我认为这是错误的根源。

如果有人对此有一个优雅的解决方法/解决方案,我将不胜感激。

4

0 回答 0