RMagick,Tempfile,Paperclip:如何将大尺寸和小kbs的图像文件保存为缩略图?

时间:2013-01-07 16:59:06

标签: ruby-on-rails ruby paperclip rmagick temporary-files

我有一个处理一批图像的Rails rake任务。它剥离了白色背景(使用RMagick),将其替换为透明层,将其写入临时文件,然后将其作为PNG保存在Amazon S3上(使用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无法通过'identify'命令识别。,Image transparent C:/ Users / Roger / AppData /本地/温度/ processed_   “识别”命令无法识别image20130107-8640-1ck71i820130107-8640-i6p91w.png。

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

小文件的Tempfile问题?

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

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

其他观察结果:

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

    2013年1月7日更新

    我对此进行了更多调查。我重申上面的#1,但试图用Paperclip保存到S3。这会生成相同的错误消息。

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

    如果有人有一个优雅的解决方法/解决方案,我会很感激听到它。

0 个答案:

没有答案