2016-09-02 13 views
0

これは、ディスクにイメージをダウンロードします。検証ダウンロードした画像

image = open permalink_url, "rb", &:read 
... 
File.binwrite "images/#{hash}", image 

時にはそれが破損しています:

enter image description here

も例外がなかった一方で。

  1. イメージが正しくダウンロードされたかどうかを確認するには(手順を再試行するには)?
  2. どれくらい大丈夫ですか?例外はありませんでしたか?どうやってそうなった?一部の仲介サーバーでネットワーク例外が抑制されましたか?

UPD:ImageMagickのはidentify "reports if an image is incomplete or corrupt"言うが、それはしません。

  1. https://drive.google.com/file/d/0B3BLwu7Vb2U-MnNqdHV4MzFSX2s/view?usp=sharing
  2. https://drive.google.com/file/d/0B3BLwu7Vb2U-d3Fab2lmT1hvZlE/view?usp=sharing

UPD:I赤いここ

$ identify temp.png 
temp.png PNG 1080x1080 1080x1080+0+0 8-bit sRGB 2.126MB 0.000u 0:00.049 

は2個の破損したイメージがあります画像を所有して分析しました。悪い変化には、真ん中のどこかに300000余分なバイトがたくさんあります。ゴミは0x00だけではなく、ランダムに見えます。

+1

あなたはファイルサイズを用意してください。テーブル?おそらく、最初のステップとしてそれを比較することができます。 – Geo

答えて

1

画像処理宝石のいずれかを使用してください。 chunky_png

require 'chunky_png' 
begin 
    ChunkyPNG::Datastream.from_file('bad.png') 
rescue ChunkyPNG::CRCMismatch 
    puts "png corrupted!" 
end 

編集Datastreamは、この場合、Imageよりも効率的です。

編集2:あなたはImageMagickのは扱うことができ、外部バイナリを呼び出す気にしない任意の形式を検証することができるようにしたい場合は、これは動作するはずです:

unless system('identify', '-verbose', 'bad.jpg', out: IO::NULL, err: IO::NULL) 
    puts "the file can't be opened or is corrupted" 
end 
+0

私は月曜日にそれを試してみましょう。しかし、JPG、BMPなど、ユーザーがアップロードしたものもあります。 – Nakilon

+0

ImageMagickを使用する宝石のいずれかを使用できます。 'identify'は破損を報告しませんが、あなたにはエラーメッセージが表示されます。イメージを別の形式に '変換 'しようとします。 – michau

+0

ありがとう! '-verbose'を用いた' identify'は完全に動作します。 – Nakilon

関連する問題