Jak usunąć metadane z plików obrazów

17

[ EDYCJA nr 1 autorstwa OP: Okazuje się, że na dość dobre odpowiedzi twórca / opiekun exiftool Phil Harvey w duplikacie wątku na forum ExifTool ]

[ EDYCJA 2 przez OP: Z FAQ ExifTool : Nie gwarantuje się, że ExifTool całkowicie usunie metadane z pliku podczas próby usunięcia wszystkich metadanych. Zobacz „Ograniczenia pisarza”.]

Chciałbym przeszukać moje stare dyski twarde w poszukiwaniu zdjęć, których nie ma na bieżącym dysku z kopią zapasową. Formaty obejmują jpg, png, tif itp., A także różne surowe formaty (różne modele kamer i producentów).

Interesuje mnie tylko wyjątkowość samego obrazu, a nie wyjątkowość z powodu różnic, powiedzmy, wartości tagów exif, obecności / braku samego tagu exif, osadzonych miniatur itp.

Mimo że nie spodziewam się, że znajdę jakiekolwiek uszkodzenie / rotację danych między różnymi kopiami w przeciwnym razie identycznych obrazów, chciałbym to wykryć, a także różnice wynikające z zmiany rozmiaru i zmiany kolorów.

[ Edytuj nr 3 przez OP: Dla wyjaśnienia: niewielki odsetek fałszywych trafień jest dopuszczalny (plik jest uznawany za wyjątkowy, gdy nie jest), a fałszywe negatywy są wysoce niepożądane (plik jest błędnie uznawany za duplikat). ]

Mój plan polega na zidentyfikowaniu unikatowości na podstawie sum md5 po usunięciu wszystkich metadanych.

Jak mogę usunąć metadane?

Czy exiftool -all= <filename>wystarczy?

Jeff
źródło
1
Biblioteki kompresji JPEG kompresują się na różne sposoby, dlatego nawet jeśli usuniesz wszystkie metadane, nadal możesz skończyć z tym samym obrazem z inną sumą kontrolną, ponieważ został skompresowany przy użyciu innej implementacji JPEG. Będziesz musiał ponownie zapisać wszystkie obrazy przy użyciu tej samej biblioteki (co może nieco obniżyć jakość). Jak planujesz znaleźć wszystkie obrazy? filenie uda się odkryć formatów obrazów RAW i findbędzie działał tylko na rozszerzeniach (przydatne może być lepsze opisanie tego, co masz)
grochmal 27.09.16
Użyłem find $dir -type f -regextype posix-extended -regex ".*\.(jpg|png|<...>|cr2|raw|raf|orf)"gdzie <...>oznacza kilka innych sufiksów.
Jeff
Dobra uwaga na temat różnych bibliotek kompresji.
Jeff
1
Możesz spróbować, jeśli znormalizowane obrazy BMP convert image.jpg - | md5sum(ImageMagick) dają odpowiednie sumy MD5.
awenturyn
1
Istnieje percepcyjny algorytm haszujący o nazwie phash, który jest przydatny do porównywania podobnych pod względem percepcyjnym dwóch obrazów. stackoverflow ma tutaj znacznik stackoverflow.com/questions/tagged/phash Teraz posiadanie narzędzia, które porównuje dwa pliki jest przydatne, ale może prowadzić do pracy O (n * n). w celu znalezienia wszystkich dopasowań. Prawdopodobnie istnieją przepływy pracy, które działają lepiej, ale nie znam jednego z nich. Ale phash jest bułką tartą, która może doprowadzić cię do jednego. Widocznie ImageMagick ma jakieś wsparcie phash
infixed

Odpowiedzi:

12

jheadma możliwość usuwania metadanych innych niż obrazy z plików JPEG. Strona podręcznika mówi:

-dc

Usuń pole komentarza z nagłówka JPEG. Uwaga: komentarz nie jest częścią nagłówka Exif.

-de

Usuń całkowicie nagłówek Exif. Pozostawia nienaruszone inne sekcje metadanych.

-di

Usuń sekcję IPTC, jeśli jest obecna. Pozostawia nienaruszone inne sekcje metadanych.

-dx

Usuń sekcję XMP, jeśli jest obecna. Pozostawia nienaruszone inne sekcje metadanych.

-du

Usuń sekcje jpeg, które nie są Exif, nie komentują i w inny sposób nie przyczyniają się do obrazu - takie jak dane, które Photoshop może pozostawić na obrazie.

-purejpg

Usuń wszystkie sekcje JPEG, które nie są konieczne do renderowania obrazu. Usuwa wszelkie metadane, które różne aplikacje mogły pozostawić na obrazie. Kombinacja opcji -de -dci -du.

Toby Speight
źródło
Znacznik obrotu można uznać za „niezbędny do renderowania obrazu”.
Jeff
1
powinno być jasne, ale działa tylko w przypadku plików JPEG
serv-inc
6

Wybrałbym ImageMagick dla większości obrazów. Wynika to z faktu, że różne implementacje bibliotek dają różne skompresowane wyniki, ImageMagick może przeprowadzić ujednolicenie kompresji.

Typowe typy są łatwe, ponieważ system operacyjny ma biblioteki do ich odczytu i zapisu. Więc:

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

Zapewni to, że masz obrazy zapisane w ten sam sposób. A potem możesz wykonać:

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

W przypadku formatów RAW uważam, że jedynym sposobem jest zrobienie tego, co mówi Phil, a zatem:

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

A potem suma kontrolna byłaby taka sama. Musisz tylko trzymać kciuki, aby bardziej egzotyczne formaty obrazu można było utworzyć za pomocą jednej implementacji (lub mieć sztywny format pliku).

Oświadczenie : To zadziała, aby porównać sumy kontrolne między sobą. Jeśli przechowujesz sumy kontrolne, a następnie uruchom ponownie -strippo aktualizacji zliblub libjpegmożesz zakończyć z zupełnie innymi sumami kontrolnymi. Za każdym razem musisz zbudować sumy kontrolne dla każdego obrazu. Biorąc pod uwagę obawy dotyczące jakości obrazu, mądrze jest uruchomić to tylko raz .

grochmal
źródło
Popraw mnie, jeśli się mylę. Załóżmy, że dwa pliki reprezentują ten sam obraz, ale zostały skompresowane przy użyciu dwóch różnych bibliotek. Czy nie będą „rozpakowywać” na różne piksele, ponieważ jpg jest stratny?
Jeff
1
Często nie, JPEG2000 ma dobrze zdefiniowany DCT, ale to tylko część transformacji obrazu. Kodowanie huffmana powinno być takie samo. Ale to w zakresie, w jakim standard pozwala na kompresowanie wyniku za pomocą biblioteki kompresji. Teoretycznie biblioteki kompresji (np. Zlib) zawsze dają różne wyniki (nawet dla tego samego algorytmu), ale większość bibliotek jpeg wysyła RNG w ten sam sposób, aby zachować rozsądek (np. Libjpeg robi to).
grochmal
@Jeff Problem jest całkiem naturalny, ponieważ stratność oznacza utratę informacji.
awenturyn
Oczywiście, jeśli zdefiniujesz inną jakość kompresji (np. -quality), Wszystkie zakłady są wyłączone.
grochmal
Może być problem z tą odpowiedzią. Tagi JFIF, w tym JFIFversion, są wstawiane przez opcję imagemagick -strip. Aby to zobaczyć, uruchom exiftool -a -G1 -s <filename>pliki utworzone za pomocą mogrify -stripi exiftool -all=. Aby potwierdzić, uruchom exiftool -a -G1 -s <original-filename> | grep JFIF. Przyszłe uruchomienia skryptu musiałyby w jakiś sposób wziąć to pod uwagę, gdyby wersja JFIF była inna.
Jeff
6

Dzięki imagemagickpakietowi i nie tylko dla plików JPEG możesz po prostu:

mogrify -strip *.jpg

Z instrukcji :

-strip

usuń obraz dowolnych profili, komentarzy lub tych fragmentów PNG: bKGD, cHRM, EXIF, gAMA, iCCP, iTXt, sRGB, tEXt, zCCP, zTXt, data.

O wiele więcej informacji i ostrzeżeń tutaj .

Uwaga: Jest to podobne do @grochmal, ale o wiele prostsze i prostsze.

Pablo A.
źródło
Jak na ten wątek, lepiej iść exiftool -all= *.jpgdo usuwania danych jpg.
Walt W
0

Możliwe rozwiązanie, które właśnie przyszło mi do głowy. Pomija kwestię metadanych. Zakłada, że ​​pliki kończą się samym obrazem, a wszystkie metadane znajdują się na początku pliku.

Odwołajmy się do aktualnego dysku do tworzenia kopii zapasowych jako do złotego dysku.

W przypadku obrazów na złotym dysku:

  1. Usuń wszystkie osadzone miniatury.
  2. Fragmentuj plik, zaczynając od jego końca, kończąc, powiedzmy, M = 100k bajtów. Odwołaj się do pierwszego tailing (który zawiera koniec pliku) jako fragmentu końcowego.
  3. Oblicz sumy md5 każdej porcji i zapisz je na głównej liście zwanej złotą listą.

W przypadku obrazów na starych dyskach :

  1. Usuń wszystkie osadzone miniatury.
  2. Usuń ostatnie M bajtów pliku.
  3. Oblicz jego sumę md5.
  4. KLASA U: Jeśli sumy nie ma na złotej liście, to należy stwierdzić, że plik jest unikalny dla złotego dysku. Skopiuj go na złoty dysk. Oblicz sumy md5 pozostałych fragmentów i dodaj je do złotej listy. Przejdź do następnego pliku.
  5. W przeciwnym razie, odsuń od drugiego do ostatniego M bajtów. Ale jeśli pozostałe bajty są mniejsze niż, powiedzmy, N = 50k, to nie usuwaj M bajtów. Zamiast tego przetworz pozostałe jako nieco zbyt duży fragment. N musi być większy niż największe miejsce zajęte przez regiony nagłówka (z wyłączeniem miniatur).
  6. Oblicz md5sum porcji.
  7. Porównaj do złotej listy i tak dalej.
  8. KLASA D: Jeśli sumy dla wszystkich części znajdują się na złotej liście, to wyciągnij wniosek, że jest to duplikat.
  9. KLASA P: Jeśli sumy dla wszystkich części, ale ostatnie znajdują się na złotej liście, to wyciągnij wniosek, że prawdopodobnie jest to duplikat.

Klasa P będzie zawierać obrazy, które znajdują się na złotym dysku, ale mają różne exifdata lub mają uszkodzenie / rotację danych w wiodących bajtach obrazu.

Po zakończeniu zbadaj interaktywnie KLASĘ P, porównując ich do swoich towarzyszy na złotym dysku.

Zobacz EDYCJA nr 3 do OP.

Przypisanie do KLASY U i D powinno być 100% dokładne.

Rozmiar KLASY P zależy od wielkości porcji M, ponieważ pierwsze M + N bajtów pliku prawie na pewno zawierają pewne dane obrazu (i wszystkie metadane)

Jeff
źródło
Zrobiłem trochę formatowania twojego postu (więc używa wyliczenia przecenienia zamiast zatłoczonych akapitów). Nadal uważam, że dość ezoteryczne jest ustalenie, co masz na myśli,
mówiąc o KLASIE
przypisz każdy plik obrazu na starym dysku twardym do jednej z trzech klas U (nique), D (upplicate) P (solidnie duplikat)
Jeff
0

Jeśli stare dyski zawierają głównie duplikaty (w tym metadane), wykonaj dwa kroki, aby znaleźć unikaty zdefiniowane w OP (który uznaje dwa pliki za duplikaty, nawet jeśli różnią się metadanymi):

  1. Skorzystaj z md5 sum nienaruszonych, niepasowanych plików, aby zidentyfikować, które pliki na starych dyskach są unikalne (w tym alternatywnym znaczeniu) na bieżącym dysku kopii zapasowej, przypisując je do klasy uU (bez pasów - unikatowy) lub do klasy D (upilcate). KLASA D będzie w 100% dokładna. Klasa uU powinna być mała (przy powyższym założeniu) i zawierać mieszankę prawdziwych duplikatów (w OP Sense) i prawdziwych unikatów.

  2. Pracując z małym, tzn. Zarządzalnym zestawem plików w CLASS uU, użyj md5sums i różnych technik usuwania, aby zaprojektować metodę porównywania plików, która jest przydatna do celów określonych w OP.

Jeff
źródło
0

To jest trochę stare, ale tak, exiftool działa bardzo dobrze.

Pokaż metadane z

exiftool photo.jpg

Pokaż metedane dla wszystkich plików * .jpg

Uwaga: w rozszerzeniu rozróżniana jest wielkość liter .

exiftool -ext jpg

Tak jak powyżej, ale zawierają podkatalogi.

exiftool -r -ext jpg .

Usuń wszystkie metadane

exiftool -all= -overwrite_original photo.jpg

Usuń wszystkie metadane wszystkich plików * .jpg z bieżącego katalogu

exiftool -all= -overwrite_original -ext jpg 

Tak jak powyżej, ale zawierają podkatalogi.

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

Usuń wszystkie metadane GPS plików * .jpg z bieżącego katalogu

exiftool -gps:all= *.jpg
RJ
źródło