Ruby on rails RMagick、Tempfile、回形针:如何将大尺寸、小kbs的图像文件保存为缩略图?

Ruby on rails RMagick、Tempfile、回形针:如何将大尺寸、小kbs的图像文件保存为缩略图?,ruby-on-rails,ruby,paperclip,rmagick,temporary-files,Ruby On Rails,Ruby,Paperclip,Rmagick,Temporary Files,我有一个Rails rake任务,它正在处理一批图像。它去掉白色背景(使用RMagick),替换为透明层,将其写入tempfile,然后将其保存为AmazonS3上的PNG(使用回形针) 它适用于大部分图像。但是,至少有一个图像出现错误。有人能帮我弄清楚为什么以及如何修复它吗 代码示例: require 'RMagick' require 'tempfile' include Magick task :task_name => :environment do x = Item.fi

我有一个Rails rake任务,它正在处理一批图像。它去掉白色背景(使用RMagick),替换为透明层,将其写入tempfile,然后将其保存为AmazonS3上的PNG(使用回形针)

它适用于大部分图像。但是,至少有一个图像出现错误。有人能帮我弄清楚为什么以及如何修复它吗

代码示例:

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
错误消息:

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/Processing_image20130107-8640-1ck71i820130107-8640-i6p91w.png未被“标识”命令识别,图像透明C:/Users/Roger/AppData/Local/Temp/Processing_ image20130107-8640-1ck71i820130107-8640-i6p91w.png未被“标识”命令识别

此消息在运行最后一行(保存操作)时显示

小文件的临时文件问题?

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

我怎样才能证实情况是否如此?如果是的话,我该如何应对呢

其他观察结果:

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
  • 当我将故障图像写入普通文件(而不是Tempfile)时,它成功地在本地保存
  • 该任务适用于其他图像,这些图像往往更大(~1-2MB)
  • processedImage.write
    之后,我检查了
    tempImageFile.size
    。它说,它是30kb的预期
  • 当我在rake任务运行时观察temp file目录时,我可以看到任务成功运行时创建的temp文件。这些文件似乎在运行
    processedImage.write
    时显示。但是,对于故障图像,我看不到创建过临时文件
  • 谢谢你的建议

    2013年1月7日更新

    我对此进行了更多的调查。我重新运行了上面的#1,但试图用回形针保存到S3上。这将生成相同的错误消息


    因此,我认为现在的问题是,这是一个以字节(32kb)为单位的小文件,但高度和宽度(800x800)都不错。回形针正试图保存它的缩略版本,即90x90。通常情况下,这会生成一个文件大小,这可能有助于@Ahmad-抱歉,我一定是在你发布时更新了这个问题。我认为问题在于文件大小?(见更新相关段落)。