JPEG встроенная контрольная сумма / отпечаток пальца? - PullRequest
6 голосов
/ 20 октября 2008

Я собираю скрипт для поиска дубликатов удаления в большой библиотеке изображений. На данный момент я делаю двухпроходный фильтр: сначала нахожу файлы одинакового размера, а затем выполняю sha256 для фрагмента файла размером 10240 байт, чтобы получить отпечатки файлов того же размера (код здесь ).

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

Кто-нибудь знает, существуют ли контрольные суммы или другие компоненты, которые могут действовать как контрольные суммы / отпечатки пальцев? Если да, есть ли эффективный способ доступа к ним?

Ответы [ 6 ]

4 голосов
/ 20 октября 2008

Я не думаю, что спецификация JPEG включает в себя какую-либо контрольную сумму в способе, который вы описываете.

Однако JPEG может содержать миниатюру как часть метаданных EXIF. Это не идеальный индикатор, так как два разных изображения могут иметь один и тот же эскиз. По крайней мере, один документированный случай, когда эскиз не был заменен после того, как изображение подверглось существенным изменениям, сказал, что эскиз показывает гораздо больше, чем планировал издатель.

1 голос
/ 03 января 2011

Я только что построил очень похожий скрипт. Я не хочу метаданных контрольной суммы, я хочу видеть, являются ли реальные изображения дубликатами, даже если теги были изменены. Лучше всего не сортировать по размеру, а сортировать по контрольной сумме istelf. Я использую jhead для удаления метаданных, а затем проверяю сумму всего файла (но я также думал о том, чтобы просто выполнить его часть, но на самом деле я не думаю, что это экономит много времени). jhead не использует разделяемую память (каналы) и перезаписывает, поэтому сначала я просто копирую файл в разделяемую память. Я помещаю контрольную сумму в поле ImageDescription для последующего более быстрого поиска. Очевидно, что это также позволяет позже проверить целостность изображения и является частью того, почему я проверяю сумму целиком. Совет: exiv2 НАМНОГО быстрее для чтения и записи метаданных, чем exiftool для манипуляций, основанных на единовременных решениях.

1 голос
/ 20 октября 2008

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

0 голосов
/ 09 сентября 2012

В спецификации XMP есть идентификатор документа и идентификатор версии, которые должны однозначно идентифицировать версию изображения.

Проблема с ними (и с любым другим методом идентификации на основе метаданных) заключается в том, что некоторые приложения могут не учитывать его, которые могут соответствующим образом изменить содержимое jpeg, обновляющего метаданные.

0 голосов
/ 20 октября 2008

Один из способов выполнить это - уменьшить все изображения до фиксированного размера и сохранить его в виде эскиза. Затем сравнение изображений будет сравнивать изображения одинакового размера и даст вам шанс стать дубликатом - полезно, если вы обрезали (если не сильно обрезали) или изменили размеры изображений и хотите найти эти «дубликаты».

0 голосов
/ 20 октября 2008

В стандарте JPEG (ITU-T.81) я считаю, что нет никакого элемента поля / синтаксиса, который имеет контрольную сумму или тому подобное, для всего сжатого файла изображения в формате JPEG. Если пользовательское приложение не помещает такие поля в сегмент приложения или в качестве метаданных, для которых сегменты представлены в стандарте. Таким образом, чтобы служить вашей цели, то, что вы делаете, это один Soln. Другим может быть какая-то оболочка приложения, которая вызовет некоторое сравнение двоичных файлов (например, за пределами сравнения или даже команду windows fc / b ) и проверит результат этой утилиты сравнения и примет решение, которое вы хотите к.

-AD

...