我有一个 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。
我如何验证是否是这种情况?如果是,我该如何解决?
其他观察:
- 当我将故障图像写入普通文件(而不是 Tempfile)时,它会成功保存在本地。
- 该任务适用于其他图像,这些图像往往更大(~1-2MB)
- 之后
processedImage.write
,我检查了tempImageFile.size
。它说它是预期的30kb。 - 当我在 rake 任务运行时观察临时文件目录时,我可以看到任务成功运行其他图像时正在创建的临时文件。文件似乎在
processedImage.write
运行时出现。但是,对于故障图像,我没有看到任何临时文件被创建。
感谢您的任何建议。
2013 年 1 月 7 日更新
我对此进行了更多调查。我重新运行了上面的#1,但尝试使用 Paperclip 保存到 S3。这产生了相同的错误消息。
所以现在我认为问题在于这是一个字节数(32kb)的小文件,但具有不错的高度和宽度(800x800)。Paperclip 正在尝试保存它的缩略图版本,即 90x90。通常,这会生成小于原始文件大小 1% 的文件大小,我认为这是错误的根源。
如果有人对此有一个优雅的解决方法/解决方案,我将不胜感激。