Есть ли инструмент для проверки целостности файлов серии изображений?

Иногда, когда вы загружаете изображение, а соединение прерывается в середине потока, у вас остается загруженное наполовину изображение. Если вы попытаетесь просмотреть его, вы получите верхнюю часть изображения, а нижняя часть обычно окрашена в серый, зеленый или какой-либо другой цвет. Другими словами, он поврежден.

Есть ли способ проверить, повреждено ли изображение таким образом или иным образом?

Ответы (5)

Если вы говорите о файлах 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 — единственный способ воспользоваться этим.

Знаете ли вы, существуют ли где-нибудь двоичные файлы Windows для jpeginfo?
Использование инструмента jpeginfo с помощью git clone кажется невозможным в Windows, потому что «aux» кажется зарезервированным именем Windows, и git не может клонировать вышеупомянутый каталог в существование.
--- продолжение разговора с другого поста здесь; При распаковке архива выдает ошибку из-за 'aux'. Переименование «aux» в архиве помогло при распаковке, а затем переименование его обратно в «aux» в cygwin решило эту проблему. Но запуск make из cygwin по-прежнему приводил к многочисленным ошибкам; кое-что о wrjpgcom.c:87:54: предупреждение: несовместимое неявное объявление встроенной функции 'exit' [по умолчанию включено] #define ERREXIT(msg) (fprintf(stderr, "%s\n", msg), exit (EXIT_FAILURE)) (только один из многих)
@ldigas Я создал двоичный файл MinGW, который вы можете найти по адресу mattdm.org/misc/jpeginfo-w32/jpeginfo.exe . Я построил это в Linux как кросс-компилируемый исполняемый файл, поэтому не тестировал его, но, похоже, он собрался нормально . Я не могу обещать, что это работает, но я обещаю, что это просто исходный код, в котором нет вирусов или чего-то подобного. :)
Проголосовал за это несколько минут назад за ваши усилия, но, похоже, это не очень хорошо работает в Windows. jpeginfo -c any_jpeg_file.jpg Я предоставляю его, кажется, он сообщает о преждевременном конце файла JPEG Поток данных JPEG не содержит изображения [ОШИБКА].
Просматривая код для jpeginfo, похоже, он мало что делает, но ищет несколько значений в данных EXIF. Это также супер старый. Я уверен, что есть лучшие альтернативы (см. мой ответ ниже). исходный код: github.com/tjko/jpeginfo/blob/master/jpeginfo.c

Если речь идет не о загрузке изображений с вашей камеры, а о передаче их с компьютера на компьютер, распространенным подходом к целостности файлов являются контрольные суммы .

К сожалению, насколько я знаю, обычные форматы изображений «конечного пользователя» (jpeg, png, gif, …) не проверяются на целостность сами по себе. Но, насколько я понимаю, вопрос подразумевает автоматическую обработку, интеграция инструментов контрольных сумм ( CRC32 , MD5 , …) в рабочий процесс может быть жизнеспособным решением. Обычный подход к хранению контрольной суммы состоит в том, чтобы иметь файл с тем же именем, но с добавленным расширением, например: img123.jpg → img123.jpg.md5.

Этот подход имеет дополнительное преимущество, заключающееся в том, что вы также можете проверить целостность (например) файлов sidecar или чего-либо еще, что вы хотите передать, с помощью аналогичного механизма. И если вы сохраните файлы контрольных сумм, даже в будущем. (И у него есть недостаток, заключающийся в том, что он не интегрирован в PS, LR или другие распространенные инструменты, насколько я знаю.)

Стоит отметить, что DNG содержит контрольную сумму и может быть проверен непосредственно в Lightroom.
Я не знал об этом! Превосходно. Тоже имеет смысл. Я отредактировал ответ, чтобы сделать его более ясным. Я стремился к форматам «конечного пользователя» больше, чем к архивным форматам, хотя приятно, что DNG помогает с контрольными суммами.
Я использую «Расширенный верификатор контрольной суммы» (ACSV) Ирниса Халиуллина для расчета файлов контрольной суммы MD5, которые копируются на резервный носитель вместе с исходными файлами. ACSV работает в пакетном или интерактивном режиме. Целостность копии можно проверить в любой момент, пересчитав контрольную сумму и сравнив ее с оригиналом.

ImageVerifier сделал то, что вы хотели. К сожалению, он больше недоступен для загрузки, а поддержка прекращена 31 декабря 2017 г. (см. Ingestamatic и ImageVerifier больше не продаются ).

Старый ответ по историческим причинам

ImageVerifier (сокращенно IV) просматривает иерархию папок в поисках файлов изображений для проверки. Он может проверять TIFF, JPEG. PSD, DNG и необработанные файлы, отличные от DNG (например, NEF, CR2).

IV предназначен для обработки большого количества изображений. Иерархии папок со 100 000 изображений и более не должны вызывать проблем. В одном тестовом прогоне IV проработал 14 часов.

Существует два вида проверки, которые выполняет IV: проверка структуры и проверка хэша.

http://basepath.com/site/detail-ImageVerifier.php

Похоже, вы связаны с ImageVerifier, если да, не могли бы вы раскрыть это в своем ответе.
Я вообще не связан с продуктом. Мне нужно было проверить некоторые файлы изображений после сбоя NAS, и я использовал этот инструмент. Я просто вырезал и вставил текст с сайта, чтобы дать описание.
FWIW — это хорошо для файлов камеры (jpg и различных форматов RAW — его основное предназначение), но не так хорошо для других типов файлов без кодеков и т. Д. Функция -identify ImageMagick — еще один вариант.

Я разработал 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 еженедельных загрузок — так что это, вероятно, хороший показатель.

Типичные идентификаторы типов файлов на основе магических чисел обычно просто фокусируются на первых n байтах, поэтому это может не помочь с частично зафиксированным файлом изображения, что является основой заданного здесь вопроса. То есть очень часто встречаются файлы JPEG или PNG, о которых POSIX file(который работает таким же образом) будет сообщать правильно, но не сможет отобразить, потому что большая часть данных на самом деле отсутствует.