Иногда, когда вы загружаете изображение, а соединение прерывается в середине потока, у вас остается загруженное наполовину изображение. Если вы попытаетесь просмотреть его, вы получите верхнюю часть изображения, а нижняя часть обычно окрашена в серый, зеленый или какой-либо другой цвет. Другими словами, он поврежден.
Есть ли способ проверить, повреждено ли изображение таким образом или иным образом?
Если вы говорите о файлах JPEG, то утилита jpeginfo — это именно то, что вам нужно. Он может проверять файлы на наличие различных типов ошибок и повреждений JPEG и либо возвращать код ошибки (самая полезная вещь для сценариев), либо просто удалять файлы с ошибками.
Я использую это как часть моей первоначальной передачи файлов, чтобы убедиться, что все скопировано нормально, не полагаясь на ручную проверку. (После этого я слежу за тем, чтобы их контрольные суммы не менялись в рамках моей обычной защиты от резервного копирования/битротации.)
Программа представляет собой командную строку и поставляется в виде исходного кода, но ее должно быть легко собрать и использовать в любом дистрибутиве Linux или на Mac с правильно настроенной средой разработки. Я уверен, что вы могли бы сделать это даже в Windows с помощью Cygwin или MinGW. (Например, хотя я не могу поручиться за его целостность, этот пост в блоге кажется законным и включает предварительно скомпилированную загрузку.) Чтобы собрать его самостоятельно:
$ git clone https://github.com/tjko/jpeginfo.git
Cloning into 'jpeginfo'...
[...]
Checking connectivity... done
$ cd jpeginfo/
$ ./configure && make
Это должно создать jpeginfo
команду, которую вы можете либо запустить на месте, либо скопировать куда хотите (возможно, используя make install
).
Затем вы запускаете его следующим образом:
$ ./jpeginfo -c *.jpg
test1.jpg 1996 x 2554 24bit Exif P 6582168 [OK]
test2.jpg 1996 x 2554 24bit Exif P 6582116 Premature end of JPEG file [WARNING]
test3.jpg Corrupt JPEG data: 1 extraneous bytes before marker 0xe2 1996 x 2554 24bit Exif P 6582169 [WARNING]
Здесь test1.jpg вполне нормально, а test2.jpg я удалил несколько байтов с конца, а test3.jpg я изменил несколько случайных байтов в заголовке.
Если у вас есть файлы RAW, ознакомьтесь с этой страницей Американского общества медиа-фотографов , посвященной проверке DNG , или страницей, посвященной деталям проверки данных , на которой рассматривается использование конвертера Adobe DNG для пакетной проверки проприетарных форматов RAW. (К сожалению, это операция с графическим интерфейсом, и ее не всегда легко реализовать в сценарии.)
Если у вас есть камера, которая изначально выводит версию 1.2 DNG, это еще лучше, так как она включает встроенную контрольную сумму MD5 данных изображения. К сожалению, похоже, что это не хранится с обычными метаданными изображения — или, по крайней мере, exiftool и exiv2 не распознают его, и в целом они читают файлы 1.2 DNG — это означает, что, насколько я знаю, в настоящее время проверка Adobe tool — единственный способ воспользоваться этим.
Если речь идет не о загрузке изображений с вашей камеры, а о передаче их с компьютера на компьютер, распространенным подходом к целостности файлов являются контрольные суммы .
К сожалению, насколько я знаю, обычные форматы изображений «конечного пользователя» (jpeg, png, gif, …) не проверяются на целостность сами по себе. Но, насколько я понимаю, вопрос подразумевает автоматическую обработку, интеграция инструментов контрольных сумм ( CRC32 , MD5 , …) в рабочий процесс может быть жизнеспособным решением. Обычный подход к хранению контрольной суммы состоит в том, чтобы иметь файл с тем же именем, но с добавленным расширением, например: img123.jpg → img123.jpg.md5
.
Этот подход имеет дополнительное преимущество, заключающееся в том, что вы также можете проверить целостность (например) файлов sidecar или чего-либо еще, что вы хотите передать, с помощью аналогичного механизма. И если вы сохраните файлы контрольных сумм, даже в будущем. (И у него есть недостаток, заключающийся в том, что он не интегрирован в PS, LR или другие распространенные инструменты, насколько я знаю.)
ImageVerifier сделал то, что вы хотели. К сожалению, он больше недоступен для загрузки, а поддержка прекращена 31 декабря 2017 г. (см. Ingestamatic и ImageVerifier больше не продаются ).
ImageVerifier (сокращенно IV) просматривает иерархию папок в поисках файлов изображений для проверки. Он может проверять TIFF, JPEG. PSD, DNG и необработанные файлы, отличные от DNG (например, NEF, CR2).
IV предназначен для обработки большого количества изображений. Иерархии папок со 100 000 изображений и более не должны вызывать проблем. В одном тестовом прогоне IV проработал 14 часов.
Существует два вида проверки, которые выполняет IV: проверка структуры и проверка хэша.
Я разработал check_media_integrity простой скрипт на Python check_mi.py
, вы можете скачать его с GitHub:
https://github.com/ftarlao/check-media-integrity
Цитирую введение руководства:
check-mi — это скрипт Python 2.7, который автоматически проверяет целостность медиафайлов (изображений, видео, аудио). Вы можете рекурсивно проверить целостность одного файла или набора файлов в папке и подпапках, наконец, вы можете дополнительно вывести список поврежденных файлов с их путем и подробностями в формате CSV.
Инструмент проверяет целостность файлов, используя общие библиотеки (Pillow, ImageMagik, FFmpeg) и проверяя, когда они могут эффективно декодировать медиафайлы. Предупреждение, форматы изображений, аудио и видео очень устойчивы к дефектам и повреждениям, поэтому инструмент не может обнаружить все поврежденные файлы.
check-mi может со 100% уверенностью обнаруживать файлы с поврежденным заголовком/метаданными, усеченные файлы изображений (со strict_level > 0) и ошибки ввода-вывода устройства.
check-mi, как правило, не в состоянии обнаружить все незначительные повреждения — например, небольшая часть медиафайла, перезаписанная другими значениями. Подробно, я протестировал strict_level 1 с помощью небольшого рандомизированного эксперимента, выполненного с одним изображением в формате jpeg размером 5 МБ:
Перезаписывая часть (интервал) файла изображения нулями, вам нужен размер интервала = 1024 КБ, чтобы получить 50% шанс обнаружения повреждения. Перезаписывая часть (интервал) файла изображения с различными случайными значениями, вы получаете коэффициент обнаружения около 85% для интервалов размером от 4096 байт до 1024 КБ.
Если вы знаете способы заставить Pillow, Wand и FFmpeg быть более строгими при декодировании, пожалуйста, сообщите мне.
Принятый ответ относится к использованию jpeginfo, который является действительно старым и неподдерживаемым инструментом, написанным на C (а также не очень модульным/расширяемым). Кроме того, этот инструмент, кажется, просто ищет некоторые определенные точки данных EXIF (просматривайте исходный код в течение ~ 5 минут).
IMO, лучший инструмент под названием file-type очень прост в использовании — просто скопируйте и вставьте их примерный код и измените имя файла, если вы не знаете, как кодировать. Он проверяет магические числа, связанные с определенными известными типами файлов, и позволяет узнать, с каким файлом вы имеете дело.
Я все еще ищу больше уровней защиты, чем только это. Например, если произвольные данные хранятся после (или в) метаданных EXIF или после магических чисел, это может создать проблемы с безопасностью. Я продолжу изучать дополнительные меры безопасности и надеюсь позже обновить этот ответ.
Вот пример кода, скопированный с их веб-страницы, для ленивых:
// Node.js
const readChunk = require('read-chunk');
const fileType = require('file-type');
const buffer = readChunk.sync('unicorn.png', 0, fileType.minimumBytes);
fileType(buffer);
//=> {ext: 'png', mime: 'image/png'}
К вашему сведению, этот инструмент постоянно обновляется (последнее обновление было 3 дня назад, как и мой первоначальный ответ здесь), и в настоящее время у них 3 691 850 еженедельных загрузок — так что это, вероятно, хороший показатель.
file
(который работает таким же образом) будет сообщать правильно, но не сможет отобразить, потому что большая часть данных на самом деле отсутствует.
Ладья
Ладья
Ладья
матдм
Ладья
пользователь3773048