Проверка загруженного изображения
Это загружает образ на диск:
image = open permalink_url, "rb", &:read
...
File.binwrite "images/#{hash}", image
Иногда это искажается
пока не было исключения.
- Как проверить, правильно ли загружено изображение (чтобы в противном случае повторить процедуру)?
- Насколько это нормально, чтобы не было исключения? Как это произошло? Было ли отключено сетевое исключение на каком-либо промежуточном сервере?
UPD: Imagemagick говорит identify
"сообщает, является ли изображение неполным или поврежденным", но это не так:
$ identify temp.png
temp.png PNG 1080x1080 1080x1080+0+0 8-bit sRGB 2.126MB 0.000u 0:00.049
Вот два поврежденных изображения:
- https://drive.google.com/file/d/0B3BLwu7Vb2U-MnNqdHV4MzFSX2s/view?usp=sharing
- 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