Как удалить метаданные из файлов изображений

16

[ РЕДАКТИРОВАТЬ # 1 OP: Оказывается, на этот вопрос довольно хорошо ответил создатель / сопровождающий exiftool Фил Харви в повторяющейся теме на форуме ExifTool ]

[ РЕДАКТИРОВАТЬ # 2 от OP: из ExifTool FAQ : ExifTool не гарантирует полное удаление метаданных из файла при попытке удалить все метаданные. Смотрите «Ограничения писателя».]

Я хотел бы найти на моих старых жестких дисках фотографии, которых нет на моем текущем резервном диске. Форматы включают в себя jpg, png, tif и т. Д., А также различные необработанные форматы (разные модели камер и производителей).

Меня интересует только уникальность самого изображения, а не уникальность из-за различий, скажем, в значениях тегов exif, наличии / отсутствии самого данного тега exif, встроенных миниатюр и т. Д.

Несмотря на то, что я не ожидаю обнаружить искажение / искажение данных между различными копиями идентичных изображений, я хотел бы обнаружить это, а также различия из-за изменения размера и изменения цвета.

[ Редактировать # 3 от OP: Для пояснения: допустим небольшой процент ложных срабатываний (файл считается уникальным, если это не так), а ложные отрицания крайне нежелательны (ошибочно считается, что файл является дубликатом). ]

Мой план состоит в том, чтобы определить уникальность на основе md5sums после удаления любых метаданных.

Как я могу удалить метаданные?

Хватит ли exiftool -all= <filename>?

Джефф
источник
1
Библиотеки сжатия JPEG сжимают по-разному, поэтому, даже если вы удалите все метаданные, вы все равно можете получить одно и то же изображение с другой контрольной суммой, потому что оно было сжато с другой реализацией JPEG. Вам нужно будет повторно сохранить все изображения, используя одну и ту же библиотеку (что может несколько снизить качество). Также, как вы планируете найти все изображения? fileне сможет обнаружить форматы изображений RAW и findбудет работать только с расширениями (может быть полезно лучше описать, что у вас есть)
grochmal
Я использовал find $dir -type f -regextype posix-extended -regex ".*\.(jpg|png|<...>|cr2|raw|raf|orf)"где <...>означает кучу других суффиксов.
Джефф
Хороший вопрос о разных библиотеках сжатия.
Джефф
1
Вы можете попробовать, если нормализованные изображения BMP convert image.jpg - | md5sum(ImageMagick) дают вам соответствующие суммы MD5.
Авантюрин
1
Существует перцептивный алгоритм хэширования, называемый phash, который полезен для сравнения того, насколько перцепционно похожи два изображения. Здесь у stackoverflow есть тег. stackoverflow.com/questions/tagged/phash Теперь иметь инструмент, который сравнивает два файла, полезно, но может привести к необходимости работы O (n * n)., чтобы найти все совпадения. Вероятно, есть рабочие процессы, которые работают лучше, но я не знаю ничего лишнего. Но phash - это крошка, которая может привести вас к одному. Очевидно, у imagemagick есть какая-то фаш-поддержка
добавлено

Ответы:

11

jheadимеет возможность удалять метаданные не изображения из файлов JPEG. На странице руководства написано:

-dc

Удалить поле комментария из заголовка JPEG. Обратите внимание, что комментарий не является частью заголовка Exif.

-de

Удалить заголовок Exif полностью. Оставляет другие разделы метаданных нетронутыми.

-di

Удалите раздел IPTC, если он есть. Оставляет другие разделы метаданных нетронутыми.

-dx

Удалите раздел XMP, если он есть. Оставляет другие разделы метаданных нетронутыми.

-du

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

-purejpg

Удалите все разделы JPEG, которые не нужны для рендеринга изображения. Удаляет любые метаданные, которые различные приложения могли оставить на изображении. Сочетание параметров -de -dcи -du .

Тоби Спейт
источник
Тег поворота можно рассматривать как «необходимый для рендеринга изображения».
Джефф
1
должно быть понятно, но работает только для файлов JPEG
serv-inc
6

Я бы пошел с ImageMagick для большинства изображений. Это связано с тем, что разные реализации библиотеки будут давать разные сжатые результаты, ImageMagick может выполнять объединение сжатия.

Общие типы просты, потому что в ОС есть библиотеки для чтения и записи. Так:

find . -type f -name '*.jp*g' -o -type f -name '*.JP*G' \
       -exec mogrify -strip -taint -compress JPEG {} \;

find . -type f -name '*.png' -o -type f -name '*.PNG' \
       -exec mogrify -strip -taint -compress Lossless {} \;

find . -type f -name '*.gif' -o -type f -name '*.GIF' \
       -exec mogrify -strip -taint -compress LZW {} \;

Это гарантирует, что у вас есть изображения, написанные таким же образом. И тогда вы можете выполнить:

find . -type f -regextype posix-extended \
       -regex ".*\.(jpe?g|JPE?G|png|PNG|gif|GIF)" \
       -exec md5sum {} \; > checksums
sort -k 1 checksums |
cut -d ' ' -f 1 |
uniq -d |
while read x; do
    grep $x checksums
done

Для форматов RAW я считаю, что единственный способ - это делать так, как говорит Фил, и поэтому:

find . <blah blah> -exec exiftool -all= {} \;

И тогда контрольная сумма будет такой же. Вам просто нужно скрестить пальцы, чтобы более экзотические форматы изображений можно было создать с помощью одной реализации (или иметь жесткий формат файла).

Отказ от ответственности : это будет работать, чтобы сравнить контрольные суммы между собой. Если вы сохраните контрольные суммы, а затем повторно запустите -stripпосле обновления zlibили libjpegвы можете закончить с совершенно другими контрольными суммами. Вы должны строить контрольные суммы для каждого изображения каждый раз. Учитывая озабоченность по поводу качества изображения, целесообразно выполнить это только один раз .

grochmal
источник
Поправь меня, если я ошибаюсь. Предположим, два файла представляют одно и то же изображение, но были сжаты двумя разными библиотеками. Разве они не будут «распакованы» в разные пиксели, потому что jpg с потерями?
Джефф
1
Часто нет, JPEG2000 имеет четко определенный DCT, но это только часть преобразования изображения. Кодирование Хаффмана также должно быть одинаковым. Но это настолько далеко от стандарта, что вы можете сжать результат, используя библиотеку сжатия. В теории библиотеки сжатия (например, zlib) всегда будут давать разные результаты (даже для одного и того же алгоритма), но большинство библиотек jpeg заполняют RNG одним и тем же способом, чтобы сохранить разумность (например, libjpeg делает это).
Grochmal
@Jeff Проблема вполне естественна, так как потеря означает, что информация потеряна.
Авантюрин
Конечно, если вы определяете другое качество сжатия (например -quality), все ставки выключены.
Grochmal
Может быть проблема с этим ответом. Теги JFIF, включая JFIFversion, вставляются с помощью опции imagemagick -strip. Чтобы увидеть это, запустите exiftool -a -G1 -s <filename>файлы, созданные с помощью mogrify -stripи exiftool -all=. Чтобы подтвердить, запустите exiftool -a -G1 -s <original-filename> | grep JFIF. Будущие прогоны скрипта должны были бы каким-то образом принять это во внимание, если бы версия JFIF была другой.
Джефф
5

С imagemagickпакетом и не только для JPEG вы можете просто:

mogrify -strip *.jpg

Из руководства :

-strip

вырезать изображение любых профилей, комментариев или этих фрагментов PNG: bKGD, cHRM, EXIF, gAMA, iCCP, iTXt, sRGB, tEXt, zCCP, zTXt, даты.

Гораздо больше информации и предостережений здесь .

Примечание: это похоже на @grochmal, но гораздо проще и проще.

Пабло А
источник
В соответствии с этим потоком, лучше пойти, exiftool -all= *.jpgчтобы раздеть данные JPG.
Уолт В.
0

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

Давайте назовем текущий резервный диск золотым.

Для изображений на золотом диске:

  1. Удалите все встроенные миниатюры.
  2. Разбейте файл на части, начиная с их конца, например, с M = 100k байтов. Обратитесь к первому хвосту (который содержит конец файла) как конец чанка.
  3. Вычислите суммы md5 каждого чанка и сохраните их в главном списке, который называется «золотой».

Для изображений на старых дисках :

  1. Удалите все встроенные миниатюры.
  2. Хвост последние М байт файла.
  3. Вычислить его md5sum.
  4. КЛАСС U: Если сумма не указана в золотом списке, заключите, что файл является уникальным для золотого диска. Скопируйте его на золотой диск. Вычислить md5sums оставшихся кусков и добавить их в золотой список. Перейти к следующему файлу.
  5. В противном случае, хвост от второго до последнего M байтов. Но если оставшиеся байты меньше, чем, скажем, N = 50k, то не беритесь за М байтов. Вместо этого обработайте оставшийся кусок как слегка увеличенный. N должно быть больше, чем наибольшее пространство, занимаемое областями заголовка (исключенные эскизы).
  6. Вычислить md5sum чанка.
  7. Сравните с золотым списком и так далее.
  8. КЛАСС D: Если суммы для всех кусков находятся в списке золота, то заключите, что это дубликат.
  9. КЛАСС P: Если суммы для всех чанков, кроме последних, есть в золотом списке, сделайте вывод, что это, вероятно, дубликат.

Класс P будет содержать изображения, которые находятся на золотом диске, но имеют разные exifdata или имеют повреждение / искажение данных в начальных байтах изображения.

Когда закончите, изучите CLASS P в интерактивном режиме, сравнивая их с их товарищами на золотом диске.

См. РЕДАКТИРОВАТЬ № 3 до ОП.

Назначение в классы U и D должно быть на 100% точным.

Размер CLASS P зависит от размера фрагмента M, поскольку первые байты M + N файла почти наверняка содержат некоторые данные изображения (и все метаданные)

Джефф
источник
Я сделал некоторое форматирование вашего поста (поэтому он использует перечисление уценки, а не набитые абзацы). Тем не менее я нахожу довольно эзотерическим, чтобы выяснить, что вы имеете в виду под КЛАССОМ U, КЛАССОМ D,
КЛАССОМ
назначить каждому файлу изображения на старом жестком диске один из трех классов U (ник), D (дубликат) P (достоверно дублировать)
Джефф
0

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

  1. Используйте md5 сумм неповрежденных файлов без разметки, чтобы определить, какие файлы на старых дисках являются уникальными (в этом альтернативном смысле) для текущего резервного диска, назначив их либо CLASS uU (unstripped-Unique), либо CLASS D (upilcate). Класс D будет на 100% точным. КЛАСС uU должен быть небольшим (по вышеприведенному предположению) и содержать смесь истинных дубликатов (в смысле OP) и истинных уникальных символов.

  2. Работая с небольшим, то есть управляемым набором файлов в CLASS uU, используйте md5sums и различные методы разметки для разработки метода сравнения файлов, который полезен для целей, изложенных в OP.

Джефф
источник
0

Это немного устарело, но да, exiftool работает очень хорошо.

Показать метаданные

exiftool photo.jpg

Показать метеданные для всех файлов * .jpg

Примечание. Расширение чувствительно к регистру .

exiftool -ext jpg

То же, что и выше, но есть подкаталоги.

exiftool -r -ext jpg .

Удалить все метаданные

exiftool -all= -overwrite_original photo.jpg

Удалить все метаданные всех файлов * .jpg в текущем каталоге

exiftool -all= -overwrite_original -ext jpg 

То же, что и выше, но есть подкаталоги.

exiftool -all= -r -overwrite_original -ext jpg .

Удалить все метаданные GPS файлов * .jpg в текущем каталоге

exiftool -gps:all= *.jpg
RJ
источник