So entfernen Sie Metadaten aus Bilddateien

15

[ EDIT # 1 von OP: Es stellt sich heraus, dass diese Frage vom Exiftool-Ersteller / Betreuer Phil Harvey in einem doppelten Thread im ExifTool-Forum recht gut beantwortet wurde. ]

[ EDIT # 2 by OP: Aus ExifTool FAQ : Es wird nicht garantiert, dass ExifTool Metadaten vollständig aus einer Datei entfernt, wenn versucht wird, alle Metadaten zu löschen. Siehe 'Einschränkungen für Autoren'.]

Ich möchte meine alten Festplatten nach Fotos durchsuchen, die sich nicht auf meinem aktuellen Sicherungslaufwerk befinden. Zu den Formaten gehören JPG, PNG, TIF usw. sowie verschiedene Rohformate (verschiedene Kameramodelle und Hersteller).

Ich interessiere mich nur für die Eindeutigkeit des Bildes selbst und nicht für die Eindeutigkeit aufgrund von Unterschieden beispielsweise bei den Werten von Exif-Tags, dem Vorhandensein / Fehlen eines bestimmten Exif-Tags selbst, eingebetteten Miniaturansichten usw.

Auch wenn ich keine Beschädigung / Datenverrottung zwischen verschiedenen Kopien ansonsten identischer Bilder erwarte, möchte ich dies sowie Unterschiede aufgrund von Größenänderungen und Farbänderungen feststellen.

[ Edit # 3 by OP: Zur Verdeutlichung: Ein kleiner Prozentsatz falsch positiver Ergebnisse ist tolerierbar (eine Datei wird als eindeutig eingestuft, wenn dies nicht der Fall ist), und falsch negative Ergebnisse sind höchst unerwünscht (eine Datei wird fälschlicherweise als Duplikat eingestuft). ]]

Mein Plan ist es, die Eindeutigkeit basierend auf md5sums zu identifizieren, nachdem alle Metadaten entfernt wurden.

Wie kann ich die Metadaten entfernen?

Wird exiftool -all= <filename>ausreichen?

Jeff
quelle
1
JPEG-Komprimierungsbibliotheken werden auf unterschiedliche Weise komprimiert. Selbst wenn Sie alle Metadaten entfernen, kann es dennoch vorkommen, dass dasselbe Bild eine andere Prüfsumme aufweist, da es mit einer anderen JPEG-Implementierung komprimiert wurde. Sie müssen alle Bilder mit derselben Bibliothek erneut speichern (was die Qualität etwas beeinträchtigen kann). Wie wollen Sie auch alle Bilder finden? filewird RAW-Bildformate nicht erkennen und findfunktioniert nur mit Erweiterungen (es kann nützlich sein, besser zu beschreiben, was Sie haben)
gro♀
Ich habe verwendet, find $dir -type f -regextype posix-extended -regex ".*\.(jpg|png|<...>|cr2|raw|raf|orf)"wo <...>bedeutet eine Reihe anderer Suffixe.
Jeff
Guter Punkt zu verschiedenen Komprimierungsbibliotheken.
Jeff
1
Sie können versuchen, ob BMP-normalisierte Bilder convert image.jpg - | md5sum(ImageMagick) Ihnen die entsprechenden MD5-Summen liefern.
Aventurin
1
Es gibt einen Wahrnehmungs-Hashing-Algorithmus namens Phash, der nützlich ist, um zu vergleichen, wie wahrnehmungsähnlich zwei Bilder sind. stackoverflow hat hier ein Tag stackoverflow.com/questions/tagged/phash Jetzt ist es nützlich, ein Tool zu haben, das zwei Dateien vergleicht, aber möglicherweise dazu führt, dass Arbeit O (n * n) vorhanden ist, um alle Übereinstimmungen zu finden. Es gibt wahrscheinlich Workflows, die besser funktionieren, aber ich kenne keinen ohne weiteres. Aber Phash ist ein Brotkrumen, der Sie zu einem führen könnte. Offenbar hat imagemagick eine Art phash Unterstützung
Infix

Antworten:

10

jheadbietet die Möglichkeit, Nicht-Bild-Metadaten aus JPEG-Dateien zu entfernen. Die Manpage sagt:

-dc

Löschen Sie das Kommentarfeld aus dem JPEG-Header. Beachten Sie, dass der Kommentar nicht Teil des Exif-Headers ist.

-de

Löschen Sie den Exif-Header vollständig. Lässt andere Metadatenabschnitte intakt.

-di

Löschen Sie den IPTC-Abschnitt, falls vorhanden. Lässt andere Metadatenabschnitte intakt.

-dx

Löschen Sie den XMP-Abschnitt, falls vorhanden. Lässt andere Metadatenabschnitte intakt.

-du

Löschen Sie Abschnitte von JPEG, die nicht Exif sind, nicht kommentieren und ansonsten auch nicht zum Bild beitragen - z. B. Daten, die Photoshop möglicherweise im Bild belässt.

-purejpg

Löschen Sie alle JPEG-Abschnitte, die zum Rendern des Bildes nicht erforderlich sind. Entfernt alle Metadaten, die verschiedene Anwendungen möglicherweise im Bild hinterlassen haben. Eine Kombination der Optionen -de -dcund -du.

Toby Speight
quelle
Das Rotations-Tag kann als "zum Rendern des Bildes erforderlich" angesehen werden.
Jeff
1
sollte klar sein, funktioniert aber nur für JPEG- Dateien
serv-inc
6

Ich würde für die meisten Bilder mit ImageMagick gehen. Dies liegt daran, dass unterschiedliche Bibliotheksimplementierungen unterschiedliche komprimierte Ergebnisse erzeugen. ImageMagick kann eine Komprimierungsvereinigung durchführen.

Gängige Typen sind einfach, da das Betriebssystem über Bibliotheken zum Lesen und Schreiben verfügt. So:

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 {} \;

Dadurch wird sichergestellt, dass die Bilder auf die gleiche Weise geschrieben werden. Und dann können Sie ausführen:

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

Für die RAW-Formate glaube ich, dass der einzige Weg darin besteht, das zu tun, was Phil sagt, und daher:

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

Und dann wäre die Prüfsumme dieselbe. Sie müssen nur die Daumen drücken, damit die exotischeren Bildformate mit einer einzigen Implementierung erstellt werden können (oder ein starres Dateiformat haben).

Haftungsausschluss : Dies funktioniert, um die Prüfsummen untereinander zu vergleichen. Wenn Sie die Prüfsummen speichern und dann erneut ausführen , die -stripnach einem Update von zliboder libjpegSie können mit völlig unterschiedlichen Prüfsummen beenden. Sie müssen jedes Mal die Prüfsummen für jedes Bild erstellen. Angesichts der Bedenken hinsichtlich der Bildqualität ist es ratsam, dies nur einmal auszuführen .

gro♀
quelle
Korrigieren Sie mich, wenn ich falsch liege. Angenommen, zwei Dateien stellen dasselbe Bild dar, wurden jedoch mit zwei verschiedenen Bibliotheken komprimiert. Werden sie nicht in verschiedene Pixel "dekomprimiert", weil JPG verlustbehaftet ist?
Jeff
1
Oft nicht, JPEG2000 hat eine gut definierte DCT, aber das ist nur der Teil der Transformation des Bildes. Die Huffman-Codierung sollte ebenfalls dieselbe sein. Aber so weit der Standard reicht, können Sie das Ergebnis dann mithilfe einer Komprimierungsbibliothek komprimieren. Theoretisch führen Komprimierungsbibliotheken (z. B. zlib) immer zu unterschiedlichen Ergebnissen (auch für denselben Algorithmus), aber die meisten JPEG-Bibliotheken setzen das RNG auf die gleiche Weise, um die Dinge gesund zu halten (z. B. libjpeg tut dies).
Gro♀
@ Jeff Das Problem ist ganz natürlich, da verlustbehaftet bedeutet, dass Informationen verloren gehen.
Aventurin
Wenn Sie eine andere Komprimierungsqualität definieren (z. B. -quality), sind natürlich alle Wetten deaktiviert.
Gro♀
Möglicherweise liegt ein Problem mit dieser Antwort vor. JFIF-Tags, einschließlich JFIFversion, werden mit der Option imagemagick eingefügt-strip . Führen Sie dazu exiftool -a -G1 -s <filename>Dateien aus, die mit mogrify -stripund erstellt wurden exiftool -all=. Führen Sie zur Bestätigung den Befehl aus exiftool -a -G1 -s <original-filename> | grep JFIF. Zukünftige Läufe des Skripts müssten dies irgendwie berücksichtigen, wenn die JFIF-Version anders wäre.
Jeff
5

Mit imagemagickPaket und nicht nur für JPEGs können Sie einfach:

mogrify -strip *.jpg

Aus dem Handbuch :

-strip

Entfernen Sie das Bild von Profilen, Kommentaren oder diesen PNG-Blöcken: bKGD, cHRM, EXIF, gAMA, iCCP, iTXt, sRGB, tEXt, zCCP, zTXt, Datum.

Viel mehr Infos und Vorbehalte hier .

Hinweis: Dies ähnelt @grogling, ist jedoch viel einfacher und unkomplizierter.

Pablo A.
quelle
Gemäß diesem Thread ist es besser, exiftool -all= *.jpgJPG-Daten zu entfernen.
Walt W
0

Eine mögliche Lösung, die mir gerade in den Sinn kam. Das Problem der Metadaten wird umgangen. Es wird davon ausgegangen, dass Dateien mit dem Bild selbst enden und dass sich alle Metadaten am Anfang der Datei befinden.

Nennen wir das aktuelle Sicherungslaufwerk das Goldlaufwerk.

Für Bilder auf dem Goldlaufwerk:

  1. Entfernen Sie alle eingebetteten Miniaturansichten.
  2. Teilen Sie die Datei ab ihrem Ende auf, indem Sie beispielsweise M = 100 KByte abschneiden. Beziehen Sie sich auf das erste Tailing (das das Ende der Datei enthält) als End-Chunk.
  3. Berechnen Sie die md5-Summen jedes Chunks und speichern Sie sie in einer Master-Liste namens Goldlist.

Für Bilder auf den alten Laufwerken :

  1. Entfernen Sie alle eingebetteten Miniaturansichten.
  2. Beenden Sie die letzten M Bytes einer Datei.
  3. Berechnen Sie seine md5sum.
  4. KLASSE U: Wenn die Summe nicht in der Goldliste enthalten ist, schließen Sie, dass die Datei für das Goldlaufwerk eindeutig ist. Kopieren Sie es auf das Gold-Laufwerk. Berechnen Sie md5sums der verbleibenden Chunks und fügen Sie sie der Goldliste hinzu. Fahren Sie mit der nächsten Datei fort.
  5. Andernfalls beenden Sie das vorletzte M Byte. Wenn die verbleibenden Bytes jedoch kleiner als beispielsweise N = 50 KB sind, lassen Sie die M Bytes nicht hinter sich. Verarbeiten Sie den Rest stattdessen als leicht übergroßen Block. N muss größer sein als der größte von den Header-Bereichen belegte Speicherplatz (Miniaturansichten ausgeschlossen).
  6. Berechnen Sie die md5sum des Chunks.
  7. Vergleiche mit der Goldliste und so weiter.
  8. KLASSE D: Wenn die Summen für alle Chunks in der Goldliste enthalten sind, schließen Sie, dass es sich um ein Duplikat handelt.
  9. KLASSE P: Wenn die Summen für alle Blöcke außer den letzten in der Goldliste stehen, schließen Sie, dass es sich wahrscheinlich um ein Duplikat handelt.

Klasse P enthält Bilder, die sich auf dem Gold-Laufwerk befinden, jedoch unterschiedliche Exif-Daten aufweisen oder in den führenden Bytes des Bilds Beschädigung / Datenfäule aufweisen.

Wenn Sie fertig sind, untersuchen Sie KLASSE P interaktiv und vergleichen Sie sie mit ihren Freunden auf dem Gold-Laufwerk.

Siehe EDIT # 3 to OP.

Die Zuordnung zu KLASSE U und D sollte 100% genau sein.

Die Größe von KLASSE P hängt von der Blockgröße M ab, da die ersten M + N Bytes einer Datei mit ziemlicher Sicherheit einige Bilddaten (und alle Metadaten) enthalten.

Jeff
quelle
Ich habe Ihren Beitrag formatiert (daher wird anstelle von überfüllten Absätzen eine Markdown-Aufzählung verwendet). Trotzdem finde ich es ziemlich esoterisch herauszufinden, was du mit KLASSE U, KLASSE D, KLASSE P
meinst
Ordnen Sie jede Bilddatei auf einer alten Festplatte einer von drei Klassen U (nique), D (uplicate) P (robably duplicate)
Jeff
0

Wenn alte Laufwerke hauptsächlich Duplikate (einschließlich Metadaten) enthalten, suchen Sie in zwei Schritten nach den im OP definierten Uniques (wobei zwei Dateien als Duplikate betrachtet werden, auch wenn sie sich in den Metadaten unterscheiden):

  1. Verwenden Sie md5sums intakter nicht entfernter Dateien, um zu ermitteln, welche Dateien auf den alten Laufwerken (in diesem alternativen Sinne) für das aktuelle Sicherungslaufwerk eindeutig sind, und weisen Sie sie entweder CLASS uU (nicht entfernt - eindeutig) oder CLASS D (upilcate) zu. KLASSE D ist 100% genau. KLASSE uU sollte klein sein (nach obiger Annahme) und eine Mischung aus echten Duplikaten (im OP-Sinn) und echten Unikaten enthalten.

  2. Verwenden Sie md5sums und verschiedene Stripping-Techniken, um eine Methode zum Dateivergleich zu entwerfen, die für die in OP festgelegten Zwecke nützlich ist, und arbeiten Sie mit den kleinen, dh verwaltbaren Dateien in CLASS uU.

Jeff
quelle
0

Das ist ein bisschen alt, aber ja, exiftool funktioniert sehr gut.

Metadaten von anzeigen

exiftool photo.jpg

Metedaten für alle * .jpg-Dateien anzeigen

Hinweis: Bei der Erweiterung wird zwischen Groß- und Kleinschreibung unterschieden .

exiftool -ext jpg

Wie oben, jedoch Unterverzeichnisse einschließen.

exiftool -r -ext jpg .

Entfernen Sie alle Metadaten

exiftool -all= -overwrite_original photo.jpg

Entfernen Sie alle Metadaten aller * .jpg-Dateien im aktuellen Verzeichnis

exiftool -all= -overwrite_original -ext jpg 

Wie oben, jedoch Unterverzeichnisse einschließen.

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

Entfernen Sie alle GPS-Metadaten von * .jpg-Dateien im aktuellen Verzeichnis

exiftool -gps:all= *.jpg
RJ
quelle