Як знімати метадані з файлів зображень


17

[ EDIT №1 від OP: Виявляється, на це питання досить добре відповів автор / технічний супровід exiftool Філ Харві у двох примірниках на форумі ExifTool ]

[ EDIT # 2 від OP: З питань поширених запитань ExifTool : 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). щоб знайти всі збіги. Ймовірно, є робочі процеси, які працюють краще, але я не знаю жодного результату. Але фаш - це суха риса, яка може привести вас до одного. Очевидно imagemagick має якусь підтримку фаша
інфікований

Відповіді:


12

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

-dc

Видалити поле коментаря із заголовка JPEG. Зауважте, що коментар не є частиною заголовка Exif.

-de

Видаліть заголовок Exif повністю. Інші розділи метаданих залишають недоторканими.

-di

Видаліть розділ IPTC, якщо він є. Інші розділи метаданих залишають недоторканими.

-dx

Видаліть розділ XMP, якщо він є. Інші розділи метаданих залишають недоторканими.

-du

Видаліть розділи jpeg, які не є Exif, не коментують, інакше не сприяють зображенню - наприклад, дані, які Photoshop може залишити на зображенні.

-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ви можете закінчити зовсім інші контрольні суми. Вам потрібно кожного разу створювати контрольні суми для кожного зображення. З огляду на занепокоєння щодо якості зображення, розумно запустити це лише один раз .


Виправте мене, якщо я помиляюся. Припустимо, два файли являють собою одне і те ж зображення, але стиснуті двома різними бібліотеками. Не вдасться їх "розпакувати" у різні пікселі, оскільки jpg втрачає?
Джефф

1
Часто ні, JPEG2000 має чітко визначений DCT, але це лише частина перетворення зображення. Кодування Хаффмана також має бути однаковим. Але це стосується стандарту, ви можете фактично стиснути результат за допомогою бібліотеки стиснення. Теоретично бібліотеки стиснення (наприклад, zlib) завжди даватимуть різні результати (навіть для одного і того ж алгоритму), але більшість бібліотек jpeg закладають RNG таким же чином, щоб зберегти речі в чистоті (наприклад, libjpeg робить це).
грочмал

@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 була іншою.
Джефф

6

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

mogrify -strip *.jpg

З посібника :

-strip

зніміть зображення будь-яких профілів, коментарів або цих фрагментів PNG: bKGD, cHRM, EXIF, gAMA, iCCP, iTXt, sRGB, tEXt, zCCP, zTXt, дата.

Набагато більше інформації та застереження тут .

Примітка. Це схоже на @grochmal, але набагато простіше і простіше.


Відповідно до цього потоку, краще перейти exiftool -all= *.jpgдо даних jpg.
Walt W

0

Можливе рішення, яке щойно прийшло в голову. Це оминає питання щодо метаданих. Передбачається, що файли закінчуються самим зображенням, що всі метадані знаходяться на початку файлу.

Давайте розглянемо поточний резервний диск як золотого диска.

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

  1. Видаліть вбудовану мініатюру.
  2. Згорніть файл, починаючи з їх кінця, відклавши, скажімо, M = 100 к байт. Зверніться до першого хвоста (який містить кінець файлу) як кінцевий фрагмент.
  3. Обчисліть md5суми кожного фрагменту і збережіть їх у головному списку під назвою goldlist.

Зображення на старих накопичувачах :

  1. Видаліть вбудовану мініатюру.
  2. Хвіст останнього М байта файлу.
  3. Обчисліть його md5sum.
  4. КЛАС U: Якщо сума відсутня у списку золота, то висновок, що файл є унікальним для золотого накопичувача. Скопіюйте його на золотопривід. Обчисліть md5суми залишилися фрагментів і додайте їх до списку золота. Перехід до наступного файлу.
  5. В іншому випадку відмовте від другого до останнього М байтів. Але якщо решта байтів менші, ніж, скажімо, N = 50k, то не відмовляйтеся від байтів M. Замість цього обробляйте решту як трохи звеликий шматок. N має бути більшим, ніж найбільше місце, яке споживається областями заголовка (мініатюри виключаються).
  6. Обчисліть частину md5sum.
  7. Порівняйте із золотим списком тощо.
  8. КЛАС D: Якщо суми за всі шматки знаходяться в золотому списку, то зробіть висновок, що це дублікат.
  9. КЛАС П: Якщо суми за всі шматки, але останні є в списку золота, то підсумуйте, що це, мабуть, дублікат.

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

Закінчивши, вивчіть CLASS P інтерактивно, порівнюючи їх зі своїми товаришами на золотому диску.

Див. EDIT № 3 до OP.

Призначення до класу U та D повинно бути на 100% точним.

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


Я зробив кілька форматування вашої публікації (тому вона використовує перерахування розмітки, а не забиті абзаци). І все-таки мені здається досить езотеричним з'ясувати, що ви маєте на увазі під КЛАСУ U, КЛАС D, КЛАС P ...
grochmal

призначити кожен файл зображень на старому жорсткому диску одному з трьох класів U (nique), D (копія) P (ретельно копій)
Jeff

0

Якщо старі диски містять здебільшого дублікати (включаючи метадані), то використовуйте два кроки для пошуку унікальних даних, визначених в ОП (який вважає два файли дублікатами, навіть якщо вони відрізняються метаданими):

  1. Використовуйте md5sums неушкоджених нерозкопаних файлів, щоб визначити, які файли на старих дисках є унікальними (у цьому альтернативному сенсі) поточному накопичувальному диску, привласнюючи їх або CLASS uU (unstripped-Unique), або CLASS D (upilcate). КЛАС D буде 100% точним. Клас UU повинен бути невеликим (за вищенаведеним припущенням) і містити суміш справжніх дублікатів (у сенсі OP) та справжніх унікальних.

  2. Працюючи з невеликим, тобто керованим набором файлів у CLASS uU, використовуйте md5sums та різні методи знімання, щоб розробити метод порівняння файлів, який корисний для цілей, визначених в ОП.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.