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

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

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 дополнительных байтов, разбитых на множество частей. Мусор не просто 0х00, а выглядит случайным.

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
Другие вопросы по тегам