Проверка загруженного изображения

Это загружает изображение на диск:

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

Иногда он приходит поврежденным:

введите здесь описание изображения

при этом не было исключений.

  1. Как проверить правильность загрузки образа (в противном случае повторить процедуру)?
  2. Насколько это нормально, что не было исключения? Как это произошло? Было ли отключено сетевое исключение на каком-то промежуточном сервере?

UPD: Imagemagick говорит, что identify "сообщает, если изображение неполное или повреждено", но это не так нет:

$ 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

UPD: Я повторно скачал изображение и провел некоторый анализ — плохой вариант имеет лишние 300000 байт где-то посередине, разбитые на множество частей. Мусор не просто 0x00, а выглядит случайным.


person Nakilon    schedule 02.09.2016    source источник
comment
У вас есть размер файла в таблице? Возможно, вы могли бы сравнить с этим в качестве первого шага.   -  person Geo    schedule 02.09.2016


Ответы (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
person michau    schedule 03.09.2016
comment
В понедельник попробую. Но могут быть также JPG, BMP или что-то еще, что загружает пользователь. - person Nakilon; 04.09.2016
comment
Вы можете использовать любой из драгоценных камней, которые используют ImageMagick. Обратите внимание, что хотя identify не сообщает о повреждениях, вы получите сообщение об ошибке, когда вы, например. попробуйте convert преобразовать изображение в другой формат. - person michau; 04.09.2016
comment
Спасибо! identify с -verbose работает отлично. - person Nakilon; 21.09.2016