Come eliminare i metadati dai file di immagine


16

[ EDIT # 1 di OP: risulta che questa domanda abbia una risposta abbastanza buona dal creatore / manutentore di exiftool Phil Harvey in un thread duplicato sul forum di ExifTool ]

[ EDIT # 2 per OP: dalle FAQ di ExifTool : non è garantito che ExifTool rimuova completamente i metadati da un file quando si tenta di eliminare tutti i metadati. Vedi "Limitazioni di Writer".]

Vorrei cercare i miei vecchi dischi rigidi per le foto che non si trovano sul mio attuale disco di backup. I formati includono jpg, png, tif, ecc ..., nonché vari formati non elaborati (diversi modelli e produttori di fotocamere).

Sono interessato solo all'unicità dell'immagine stessa e non all'unicità a causa delle differenze, per esempio, dei valori dei tag exif, della presenza / assenza di un dato tag exif stesso, delle miniature incorporate, ecc ...

Anche se non mi aspetto di trovare corruzione / marciume di dati tra copie diverse di immagini altrimenti identiche, vorrei rilevarlo, così come le differenze dovute al ridimensionamento e ai cambiamenti di colore.

[ Modifica n. 3 con OP: per chiarimenti: una piccola percentuale di falsi positivi è tollerabile (un file è considerato unico quando non lo è) e falsi negativi sono altamente indesiderabili (un file è erroneamente considerato un duplicato). ]

Il mio piano è quello di identificare l'unicità basata su md5sums dopo aver rimosso tutti i metadati.

Come posso eliminare i metadati?

Sarà exiftool -all= <filename>sufficiente?


1
Le librerie di compressione JPEG vengono compresse in diversi modi, pertanto, anche se si rimuovono tutti i metadati, è possibile che la stessa immagine abbia un checksum diverso poiché è stata compressa con un'implementazione JPEG diversa. Dovrai salvare nuovamente tutte le immagini utilizzando la stessa libreria (che potrebbe ridurre in qualche modo la qualità). Inoltre, come pensi di trovare tutte le immagini? filenon riuscirà a scoprire i formati di immagine RAW e findfunzionerà solo con le estensioni (potrebbe essere utile descrivere meglio ciò che hai)
grochmal

Ho usato find $dir -type f -regextype posix-extended -regex ".*\.(jpg|png|<...>|cr2|raw|raf|orf)"dove <...>significa un mucchio di altri suffissi.
Jeff,

Un buon punto su diverse librerie di compressione.
Jeff,

1
Puoi provare se le immagini normalizzate BMP convert image.jpg - | md5sum(ImageMagick) ti danno somme adeguate MD5.
Aventurin,

1
Esiste un algoritmo di hashing percettivo chiamato phash che è utile per confrontare quanto sono percettibilmente simili due immagini. stackoverflow ha un tag qui stackoverflow.com/questions/tagged/phash Ora avere uno strumento che confronta due file è utile, ma potrebbe portare a lavorare O (n * n). per trovare tutte le corrispondenze. Probabilmente ci sono flussi di lavoro che funzionano meglio, ma non ne conosco uno di persona. Ma il phash è un briciolo di pane che potrebbe condurti a uno. A quanto pare ImageMagick ha una sorta di supporto phash
infissa

Risposte:


11

jheadha la capacità di rimuovere metadati non di immagine da file JPEG. La pagina man dice:

-dc

Elimina il campo dei commenti dall'intestazione JPEG. Si noti che il commento non fa parte dell'intestazione Exif.

-de

Elimina completamente l'intestazione Exif. Lascia intatte le altre sezioni di metadati.

-di

Elimina la sezione IPTC, se presente. Lascia intatte le altre sezioni di metadati.

-dx

Elimina la sezione XMP, se presente. Lascia intatte le altre sezioni di metadati.

-du

Elimina sezioni di jpeg che non sono Exif, non commentano e che altrimenti non contribuiscono all'immagine, ad esempio i dati che Photoshop potrebbe lasciare nell'immagine.

-purejpg

Elimina tutte le sezioni JPEG che non sono necessarie per il rendering dell'immagine. Elimina tutti i metadati che varie applicazioni potrebbero aver lasciato nell'immagine. Una combinazione delle opzioni -de -dce -du.


Il tag di rotazione potrebbe essere considerato "necessario per il rendering dell'immagine".
Jeff,

1
dovrebbe essere chiaro, ma funziona solo con file JPEG
serv-inc,

6

Vorrei andare con ImageMagick per la maggior parte delle immagini. Questo perché diverse implementazioni di libreria produrranno risultati compressi diversi, ImageMagick può eseguire un'unificazione di compressione.

I tipi comuni sono facili perché il sistema operativo dispone di librerie per leggerle e scriverle. Così:

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

Questo assicurerà di avere le immagini scritte allo stesso modo. E quindi puoi eseguire:

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

Per i formati RAW credo che l'unico modo sia fare come dice Phil, e quindi:

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

E poi il checksum sarebbe lo stesso. Devi solo incrociare le dita sul fatto che i formati di immagine più esotici possono essere creati con una singola implementazione (o avere un formato di file rigido).

Disclaimer : funzionerà per confrontare i checksum tra di loro. Se si memorizzano i checksum e si esegue nuovamente -stripdopo un aggiornamento zlibo libjpegsi può finire con checksum completamente diversi. Devi creare i checksum per ogni immagine ogni volta. Date le preoccupazioni sulla qualità dell'immagine, è consigliabile eseguirlo una sola volta .


Correggimi se sbaglio. Supponiamo che due file rappresentino la stessa immagine ma siano stati compressi con due diverse librerie. Non si "decomprimeranno" in pixel diversi perché il jpg è in perdita?
Jeff,

1
Spesso no, JPEG2000 ha un DCT ben definito, ma questa è solo la parte della trasformazione dell'immagine. Anche la codifica di Huffman dovrebbe essere la stessa. Ma per quanto riguarda lo standard, è quindi possibile comprimere effettivamente il risultato utilizzando una libreria di compressione. In teoria le librerie di compressione (ad esempio zlib) produrranno sempre risultati diversi (anche per lo stesso algoritmo), ma la maggior parte delle librerie jpeg eseguono il seeding dell'RNG allo stesso modo per mantenere le cose sane (ad esempio libjpeg fa questo).
grochmal,

@Jeff Il problema è del tutto naturale poiché perdita significa che le informazioni vengono perse.
Aventurin,

Naturalmente se si definisce una diversa qualità di compressione (ad es. -quality) Tutte le scommesse sono disattivate.
grochmal,

Potrebbe esserci un problema con questa risposta. I tag JFIF, incluso JFIFversion, sono inseriti dall'opzione imagemagick -strip. Per vedere questo, esegui exiftool -a -G1 -s <filename>su file creati con mogrify -stripe exiftool -all=. Per confermare, esegui exiftool -a -G1 -s <original-filename> | grep JFIF. Le esecuzioni future dello script dovrebbero in qualche modo tenerne conto se la versione JFIF fosse diversa.
Jeff,

5

Con il imagemagickpacchetto e non solo per i JPEG puoi semplicemente:

mogrify -strip *.jpg

Dal manuale :

-strip

rimuovere l'immagine di eventuali profili, commenti o questi blocchi PNG: bKGD, cHRM, EXIF, gAMA, iCCP, iTXt, sRGB, tEXt, zCCP, zTXt, data.

Molte più informazioni e avvertenze qui .

Nota: questo è simile a @grochmal ma molto più diretto e semplice.


Come per quel thread, meglio andare con lo exiftool -all= *.jpgstriping dei dati jpg.
Walt W,

0

Una possibile soluzione che mi è appena venuta in mente. Evita il problema dei metadati. Presuppone che i file finiscano con l'immagine stessa, che tutti i metadati siano all'inizio del file.

Facciamo riferimento all'unità di backup corrente come unità d'oro.

Per immagini sul disco d'oro:

  1. Rimuovi qualsiasi miniatura incorporata.
  2. Blocca il file a partire dalla fine, tagliando, diciamo, M = 100k byte. Fare riferimento al primo tailing (che contiene la fine del file) come end-chunk.
  3. Calcola i md5sum di ogni blocco e li memorizza in un elenco principale chiamato lista d'oro.

Per immagini sulle vecchie unità :

  1. Rimuovi qualsiasi miniatura incorporata.
  2. Codifica gli ultimi M byte di un file.
  3. Calcola il suo md5sum.
  4. CLASSE U: se la somma non è nella lista d'oro, quindi concludere che il file è univoco per l'unità oro. Copialo sul disco d'oro. Calcola md5sums dei pezzi rimanenti e aggiungili alla lista d'oro. Passa al file successivo.
  5. Altrimenti, tagliare il penultimo byte. Ma se i byte rimanenti sono inferiori a, diciamo, N = 50k, allora non ridurre i byte M. Elabora invece il rimanente come un pezzo leggermente sovradimensionato. N deve essere maggiore dello spazio più grande consumato dalle regioni dell'intestazione (miniature escluse).
  6. Calcola il md5sum del pezzo.
  7. Confronta con la lista d'oro e così via.
  8. CLASSE D: Se le somme per tutti i pezzi sono nella lista d'oro, concludere che è un duplicato.
  9. CLASSE P: Se le somme per tutti i pezzi, tranne l'ultimo, sono nella lista d'oro, quindi concludere che è probabilmente un duplicato.

La classe P conterrà le immagini che si trovano sul disco d'oro, ma hanno exifdata diversi o presentano corruzione / data marciume nei byte iniziali dell'immagine.

Al termine, esamina la CLASSE P in modo interattivo, confrontandoli con i loro compagni sul disco d'oro.

Vedi EDIT # 3 in OP.

L'assegnazione in CLASSE U e D deve essere accurata al 100%.

La dimensione della CLASSE P dipende dalla dimensione del blocco M, poiché i primi byte M + N di un file contengono quasi sicuramente alcuni dati di immagine (e tutti i metadati)


Ho fatto un po 'di formattazione del tuo post (quindi utilizza l'enumerazione markdown anziché i paragrafi stipati). Trovo comunque abbastanza esoterico capire cosa intendi per CLASSE U, CLASSE D, CLASSE P ...
grochmal,

assegnare ciascun file di immagine su un vecchio disco rigido a una delle tre classi U (nique), D (uplicate) P (duplicabile in modo robotico)
Jeff

0

Se le vecchie unità contengono principalmente duplicati (compresi i metadati), utilizzare due passaggi per trovare gli unici come definiti nell'OP (che considera due file come duplicati anche se differiscono nei metadati):

  1. Utilizzare md5sums di file integri intatti per identificare quali file sulle vecchie unità sono univoci (in questo senso alternativo) all'unità di backup corrente, assegnandoli a CLASS uU (unstripped-Unique) o CLASS D (upilcate). La CLASSE D sarà accurata al 100%. CLASSI Dovresti essere piccolo (come sopra ipotizzato) e contenere un mix di veri duplicati (nel senso OP) e veri unici.

  2. Lavorando con il piccolo set di file, gestibile, in CLASS uU, utilizzare md5sums e varie tecniche di stripping per progettare un metodo di confronto dei file utile per gli scopi indicati in OP.


0

Questo è un po 'vecchio, ma sì, exiftool funziona molto bene.

Mostra metadati di

exiftool photo.jpg

Mostra i metedati per tutti i file * .jpg

Nota: l'estensione fa distinzione tra maiuscole e minuscole .

exiftool -ext jpg

Come sopra, ma include sottodirectory.

exiftool -r -ext jpg .

Rimuovi tutti i metadati

exiftool -all= -overwrite_original photo.jpg

Rimuovi tutti i metadati di tutti i file * .jpg nella directory corrente

exiftool -all= -overwrite_original -ext jpg 

Come sopra, ma include sottodirectory.

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

Rimuovi tutti i metadati GPS dei file * .jpg nella directory corrente

exiftool -gps:all= *.jpg
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.