Comment supprimer les métadonnées des fichiers image

17

[ EDIT # 1 by OP: Il s'avère que cette question est très bien répondue par le créateur / mainteneur d'exiftool, Phil Harvey, dans un fil de discussion en double sur le forum ExifTool ]

[ EDIT # 2 by OP: De ExifTool FAQ : ExifTool n'est pas garanti de supprimer complètement les métadonnées d'un fichier lorsque vous essayez de supprimer toutes les métadonnées. Voir «Limitations de Writer».]

J'aimerais rechercher sur mes anciens disques durs des photos qui ne se trouvent pas sur mon lecteur de sauvegarde actuel. Les formats incluent jpg, png, tif, etc ..., ainsi que divers formats bruts (différents modèles et fabricants d'appareils photo).

Je ne m'intéresse qu'à l'unicité de l'image elle-même et non à l'unicité en raison des différences, par exemple, des valeurs des balises exif, de la présence / absence d'une balise exif donnée elle-même, des miniatures intégrées, etc.

Même si je ne m'attends pas à trouver de corruption / pourriture de données entre différentes copies d'images autrement identiques, j'aimerais détecter cela, ainsi que les différences dues au redimensionnement et aux changements de couleur.

[ Éditer n ° 3 par OP: pour clarification: un petit pourcentage de faux positifs est tolérable (un fichier est considéré comme unique lorsqu'il ne l'est pas) et les faux négatifs sont hautement indésirables (un fichier est conclu à tort comme étant un doublon). ]

Mon plan est d'identifier l'unicité basée sur les sommes md5 après avoir supprimé toutes les métadonnées.

Comment puis-je supprimer les métadonnées?

Sera exiftool -all= <filename>suffisant?

Jeff
la source
1
Les bibliothèques de compression JPEG se compressent de différentes manières.Par conséquent, même si vous supprimez toutes les métadonnées, vous pouvez toujours terminer avec la même image ayant une somme de contrôle différente car elle a été compressée avec une implémentation JPEG différente. Vous devrez réenregistrer toutes les images à l'aide de la même bibliothèque (ce qui peut diminuer quelque peu la qualité). Aussi comment prévoyez-vous de trouver toutes les images? filene découvrira pas les formats d'image RAW et findne fonctionnera que sur les extensions (il peut être utile de mieux décrire ce que vous avez)
grochmal
J'ai utilisé find $dir -type f -regextype posix-extended -regex ".*\.(jpg|png|<...>|cr2|raw|raf|orf)"<...>signifie un tas d'autres suffixes.
Jeff
Bon point sur les différentes bibliothèques de compression.
Jeff
1
Vous pouvez essayer si les images normalisées BMP convert image.jpg - | md5sum(ImageMagick) vous donnent les sommes MD5 appropriées.
aventurin
1
Il existe un algorithme de hachage perceptuel appelé phash qui est utile pour comparer la similitude perceptuelle de deux images. stackoverflow a une balise ici stackoverflow.com/questions/tagged/phash Maintenant avoir un outil qui compare deux fichiers est utile, mais peut conduire à avoir du travail O (n * n) .pour trouver toutes les correspondances. Il y a probablement des workflows qui font mieux, mais je n'en connais pas un par hasard. Mais phash est un fil d'Ariane qui pourrait vous conduire à un. Apparemment , ImageMagick a une sorte de soutien phash
infixé

Réponses:

12

jheada la possibilité de supprimer les métadonnées non-image des fichiers JPEG. La page de manuel indique:

-dc

Supprimez le champ de commentaire de l'en-tête JPEG. Notez que le commentaire ne fait pas partie de l'en-tête Exif.

-de

Supprimez entièrement l'en-tête Exif. Laisse les autres sections de métadonnées intactes.

-di

Supprimez la section IPTC, le cas échéant. Laisse les autres sections de métadonnées intactes.

-dx

Supprimez la section XMP, le cas échéant. Laisse les autres sections de métadonnées intactes.

-du

Supprimez les sections de jpeg qui ne sont pas Exif, pas de commentaire et qui ne contribuent pas non plus à l'image - telles que les données que Photoshop pourrait laisser dans l'image.

-purejpg

Supprimez toutes les sections JPEG qui ne sont pas nécessaires au rendu de l'image. Supprime toutes les métadonnées que diverses applications peuvent avoir laissées dans l'image. Une combinaison des options -de -dcet -du.

Toby Speight
la source
La balise de rotation pourrait être considérée comme «nécessaire au rendu de l'image».
Jeff
1
devrait être clair, mais ne fonctionne que pour les fichiers JPEG
serv-inc
6

J'irais avec ImageMagick pour la plupart des images. En effet, différentes implémentations de bibliothèque produiront des résultats compressés différents, ImageMagick peut effectuer une unification de compression.

Les types courants sont faciles car le système d'exploitation dispose de bibliothèques pour les lire et les écrire. Donc:

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

Cela garantira que les images sont écrites de la même manière. Et puis vous pouvez effectuer:

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

Pour les formats RAW, je crois que la seule façon est de faire comme le dit Phil, et donc:

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

Et puis la somme de contrôle serait la même. Il vous suffit de croiser les doigts pour que les formats d'image les plus exotiques puissent être créés avec une seule implémentation (ou avoir un format de fichier rigide).

Avertissement : Cela fonctionnera pour comparer les sommes de contrôle entre eux. Si vous stockez les sommes de contrôle puis réexécutez le -stripaprès une mise à jour de zlibou libjpegvous pouvez vous retrouver avec des sommes de contrôle complètement différentes. Vous devez à chaque fois créer les sommes de contrôle pour chaque image. Compte tenu des préoccupations concernant la qualité de l'image, il est sage de ne l'exécuter qu'une seule fois .

grochmal
la source
Corrigez-moi si je me trompe. Supposons que deux fichiers représentent la même image mais ont été compressés avec deux bibliothèques différentes. Ne seront-ils pas «décompressés» en différents pixels parce que jpg est avec perte?
Jeff
1
Souvent non, JPEG2000 a un DCT bien défini, mais ce n'est que la partie de la transformation de l'image. Le codage de Huffman devrait également être le même. Mais c'est aussi loin que la norme va, vous pouvez alors réellement compresser le résultat en utilisant une bibliothèque de compression. En théorie, les bibliothèques de compression (par exemple zlib) produiront toujours des résultats différents (même pour le même algorithme), mais la plupart des bibliothèques jpeg amorcent le RNG de la même manière pour garder les choses saines (par exemple libjpeg fait cela).
grochmal
@Jeff Le problème est assez naturel, car avec perte signifie que l'information est perdue.
aventurin
Bien sûr, si vous définissez une qualité de compression différente (par exemple -quality), tous les paris sont désactivés.
grochmal
Il peut y avoir un problème avec cette réponse. Les balises JFIF, y compris la version JFIF, sont insérées par l'option imagemagick -strip. Pour voir cela, exécutez exiftool -a -G1 -s <filename>sur des fichiers créés avec mogrify -stripet exiftool -all=. Pour confirmer, exécutez exiftool -a -G1 -s <original-filename> | grep JFIF. Les futures exécutions du script devraient en quelque sorte en tenir compte si la version JFIF était différente.
Jeff
6

Avec le imagemagickpackage et pas seulement pour les JPEG, vous pouvez simplement:

mogrify -strip *.jpg

Du manuel :

-strip

supprimer l'image de tout profil, commentaire ou de ces morceaux PNG: bKGD, cHRM, EXIF, gAMA, iCCP, iTXt, sRGB, tEXt, zCCP, zTXt, date.

Beaucoup plus d'informations et mises en garde ici .

Remarque: Ceci est similaire à @grochmal mais beaucoup plus simple et simple.

Pablo A
la source
Selon ce fil, mieux vaut aller avec exiftool -all= *.jpgpour supprimer les données jpg.
Walt W
0

Une solution possible qui vient à l'esprit. Il évite le problème des métadonnées. Il suppose que les fichiers se terminent par l'image elle-même, que toutes les métadonnées se trouvent au début du fichier.

Faisons référence au lecteur de sauvegarde actuel comme le lecteur d'or.

Pour les images sur le disque d'or:

  1. Supprimez toute miniature intégrée.
  2. Décompressez le fichier en commençant par sa fin en réduisant, disons, M = 100k octets. Reportez-vous à la première queue (qui contient la fin du fichier) en tant que segment de fin.
  3. Calculez les sommes md5 de chaque bloc et stockez-les dans une liste principale appelée la liste d'or.

Pour les images sur les anciens disques :

  1. Supprimez toute miniature intégrée.
  2. Supprimez les derniers M octets d'un fichier.
  3. Calculez sa somme md5.
  4. CLASSE U: Si la somme n'est pas dans la liste d'or, alors concluez que le fichier est unique au disque d'or. Copiez-le sur le disque d'or. Calculez md5sums des morceaux restants et ajoutez-les à la liste d'or. Passez au fichier suivant.
  5. Sinon, réduisez l'avant-dernier octet M octets. Mais si les octets restants sont inférieurs à, disons, N = 50k, alors ne réduisez pas les M octets. Traitez plutôt le reste comme un morceau légèrement surdimensionné. N doit être plus grand que le plus grand espace consommé par les régions d'en-tête (miniatures exclues).
  6. Calculez la somme md5 du morceau.
  7. Comparez à la liste d'or, et ainsi de suite.
  8. CLASSE D: Si les sommes pour tous les morceaux sont dans la liste d'or, alors concluez qu'il s'agit d'un doublon.
  9. CLASSE P: Si les sommes pour tous les morceaux mais les derniers sont dans la liste d'or, alors concluez qu'il s'agit probablement d' un doublon.

La classe P contiendra des images qui se trouvent sur le disque d'or, mais qui ont des exifdata différentes, ou qui ont une corruption / pourriture de données dans les octets de tête de l'image.

Une fois terminé, examinez la CLASSE P de manière interactive, en les comparant à leurs camarades sur le disque d'or.

Voir EDIT # 3 à OP.

L'affectation en CLASSE U et D doit être précise à 100%.

La taille de la CLASSE P dépend de la taille du bloc M, car les premiers M + N octets d'un fichier contiennent presque certainement des données d'image (et toutes les métadonnées)

Jeff
la source
J'ai fait une mise en forme de votre message (il utilise donc l'énumération de démarques plutôt que des paragraphes bondés). Pourtant, je trouve assez ésotérique de comprendre ce que vous entendez par CLASSE U, CLASSE D, CLASSE P ...
grochmal
attribuer chaque fichier image sur un ancien disque dur à l'une des trois classes U (nique), D (uplicate) P (dupliquer de manière robotique)
Jeff
0

Si les anciens lecteurs contiennent principalement des doublons (y compris les métadonnées), utilisez deux étapes pour trouver les uniques tels que définis dans l'OP (qui considère deux fichiers comme des doublons même s'ils diffèrent dans les métadonnées):

  1. Utilisez md5sums de fichiers non dépouillés intacts pour identifier les fichiers sur les anciens lecteurs qui sont uniques (dans ce sens alternatif) au lecteur de sauvegarde actuel, en les affectant à CLASS uU (unstripped-unique) ou à la classe D (upilcate). LA CLASSE D sera précise à 100%. La CLASSE uU doit être petite (selon l'hypothèse ci-dessus) et contenir un mélange de vrais doublons (dans le sens OP) et de vrais uniques.

  2. En travaillant avec le petit ensemble de fichiers, c'est-à-dire gérable, dans CLASS uU, utilisez des sommes md5 et diverses techniques de suppression pour concevoir une méthode de comparaison de fichiers utile aux fins énoncées dans OP.

Jeff
la source
0

C'est un peu vieux, mais oui, exiftool fonctionne très bien.

Afficher les métadonnées de

exiftool photo.jpg

Afficher les métadonnées pour tous les fichiers * .jpg

Remarque: L'extension est sensible à la casse .

exiftool -ext jpg

Identique à ci-dessus, mais inclut des sous-répertoires.

exiftool -r -ext jpg .

Supprimer toutes les métadonnées

exiftool -all= -overwrite_original photo.jpg

Supprimez toutes les métadonnées de tous les fichiers * .jpg du répertoire actuel

exiftool -all= -overwrite_original -ext jpg 

Identique à ci-dessus, mais inclut des sous-répertoires.

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

Supprimez toutes les métadonnées GPS des fichiers * .jpg du répertoire actuel

exiftool -gps:all= *.jpg
RJ
la source