验证下载的图片

时间:2016-09-02 16:52:07

标签: ruby image download corruption corrupt-data

将图像下载到磁盘:

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

有时它会被破坏:

enter image description here

虽然没有异常

  1. 如何检查图像是否已正确下载(否则重试该过程)?
  2. 多少钱,没有例外?这是怎么发生的?某个中间服务器上的网络异常是否已静音?
  3. UPD:Imagemagick说identify "reports if an image is incomplete or corrupt"但不是:

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

    以下是两张损坏的图片:

    1. https://drive.google.com/file/d/0B3BLwu7Vb2U-MnNqdHV4MzFSX2s/view?usp=sharing
    2. https://drive.google.com/file/d/0B3BLwu7Vb2U-d3Fab2lmT1hvZlE/view?usp=sharing
    3. UPD:我重新加载了图像并进行了一些分析 - 这个糟糕的变化在中间的某个地方有300000个额外的字节,在很多部分中被打破。垃圾不仅仅是0x00,而且看起来是随机的。

1 个答案:

答案 0 :(得分: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