画像のバッチを処理する 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 は「identify」コマンドで認識されません。画像透過 C:/Users/Roger/AppData /Local/Temp/processed_ image20130107-8640-1ck71i820130107-8640-i6p91w.png は「identify」コマンドで認識されません。
このメッセージは、最後の行 (保存操作) の実行時に表示されます。
小さなファイルの一時ファイルの問題?
エラーは、Tempfileが実際に一時パスにファイルを書き込んでいないことに関係していると思います。このエラーはファイルサイズが小さいことに関係している可能性がありますか? 問題が発生している特定の画像には、通常、大量の空白があるため、処理後のファイルサイズは、800x800 ピクセルの画像で約 30k になります。
これが事実であるかどうかを確認するにはどうすればよいですか? もしそうなら、どうすれば回避できますか?
その他の観察:
- トラブル イメージを (Tempfile ではなく) 通常のファイルに書き込むと、正常にローカルに保存されます。
- このタスクは、はるかに大きくなる傾向がある他の画像(〜1〜2MB)に対しては正常に機能します
- 後
processedImage.write
、チェックしましtempImageFile.size
た。予想通り30kbだそうです。 - rake タスクの実行時に一時ファイル ディレクトリを観察すると、タスクが他のイメージで正常に実行されたときに一時ファイルが作成されていることがわかります。実行するとファイルが表示されるようです
processedImage.write
。ただし、トラブル画像については、一時ファイルが作成されたことはありません。
アドバイスをありがとう。
2013 年 1 月 7 日更新
これをさらに調べました。上記の #1 を再実行しましたが、ペーパークリップで S3 に保存しようとしました。これにより、同じエラー メッセージが生成されました。
したがって、問題は、これがバイト数 (32kb) の点で小さなファイルであるが、適切な高さと幅 (800x800) を備えていることだと思います。Paperclip は、90x90 のサムネイル バージョンを保存しようとしています。通常、これにより生成されるファイルサイズは元の 1% 未満であり、これがエラーの原因であると想定しています。
誰かがこれに対するエレガントな回避策/修正を持っている場合は、それについて聞いていただければ幸いです。