Existe-t-il un outil pour vérifier l'intégrité des fichiers d'une série d'images?

21

Parfois, lorsque vous téléchargez une image et que la connexion est interrompue à mi-chemin, vous vous retrouvez avec une image à moitié téléchargée. Si vous essayez de l'afficher, vous obtenez la partie supérieure de l'image et la partie inférieure est généralement de couleur grise ou verte ou d'une autre couleur. En d'autres termes, il est corrompu.

Existe-t-il un moyen de vérifier si l'image est endommagée de cette manière ou autrement corrompue?

Tour
la source

Réponses:

15

Si vous parlez de fichiers JPEG, l'utilitaire jpeginfo est exactement ce que vous recherchez. Il peut vérifier les fichiers pour différents types d'erreurs JPEG et de corruption et retourner un code d'erreur (la chose la plus utile pour les scripts), ou simplement supprimer les fichiers contenant des erreurs.

J'utilise cela dans le cadre de mon transfert de fichier initial, pour m'assurer que tout est bien copié sans compter sur une vérification manuelle. (Après cela, je m'assure que leurs sommes de contrôle ne changent pas dans le cadre de ma protection normale de sauvegarde / bitrot.)

Le programme est en ligne de commande et est fourni en code source, mais il devrait être facile à construire et à utiliser sur n'importe quelle distribution Linux ou sur un Mac avec un environnement de développement correctement configuré. Je suis sûr que vous pourriez même le faire sur Windows avec Cygwin ou MinGW. (Par exemple, bien que je ne puisse pas garantir son intégrité, ce billet de blog semble légitime et inclut un téléchargement précompilé.) Pour le créer vous-même:

$ git clone https://github.com/tjko/jpeginfo.git
Cloning into 'jpeginfo'...
[...]
Checking connectivity... done
$ cd jpeginfo/
$ ./configure && make

Cela devrait créer une jpeginfocommande que vous pouvez exécuter sur place ou copier où vous le souhaitez (éventuellement en utilisant make install).

Ensuite, vous l'exécutez comme ceci:

$ ./jpeginfo -c *.jpg
test1.jpg 1996 x 2554 24bit Exif  P 6582168  [OK]
test2.jpg 1996 x 2554 24bit Exif  P 6582116  Premature end of JPEG file  [WARNING]
test3.jpg  Corrupt JPEG data: 1 extraneous bytes before marker 0xe2 1996 x 2554 24bit Exif  P 6582169  [WARNING]

Ici, test1.jpg est parfaitement bien, et test2.jpg j'ai supprimé quelques octets de la fin, et test3.jpg j'ai changé quelques octets aléatoires dans l'en-tête.

Si vous avez des fichiers RAW, consultez cette page de l'American Society of Media Photographers sur la validation DNG , ou une sur les détails de validation des données , qui couvre l'utilisation du convertisseur DNG d'Adobe pour valider par lots les formats RAW propriétaires. (Malheureusement, il s'agit d'une opération d'interface graphique et pas nécessairement facilement scriptable.)

Si vous avez un appareil photo qui produit nativement la version 1.2 de DNG, c'est encore mieux, car cela inclut une somme de contrôle MD5 intégrée des données d'image. Malheureusement, cela ne semble pas être stocké avec les métadonnées d'image normales - ou au moins exiftool et exiv2 ne le reconnaissent pas, et ils lisent les fichiers 1.2 DNG en général - ce qui signifie que, pour autant que je sache actuellement, la validation Adobe outil est le seul moyen de profiter de cela aussi.

mattdm
la source
Savez-vous si des binaires Windows pour jpeginfo existent quelque part?
Tour
1
L'utilisation de l'outil jpeginfo par git clone ne semble pas possible sous Windows, car 'aux' semble être un nom réservé à Windows et git ne peut pas cloner le répertoire susmentionné.
Tour
--- reprendre la conversation de l'autre poste ici; Décompresser l'archive donne une erreur à cause de 'aux'. Renommer «aux» dans l'archive a aidé à décompresser puis à le renommer en «aux» dans cygwin a résolu ce problème. Mais exécuter make depuis cygwin a entraîné de nombreuses erreurs encore; quelque chose à propos de wrjpgcom.c: 87: 54: avertissement: déclaration implicite incompatible de la fonction intégrée 'exit' [activée par défaut] #define ERREXIT (msg) (fprintf (stderr, "% s \ n", msg), exit (EXIT_FAILURE)) (juste un des nombreux)
Rook
@ldigas J'ai construit un binaire MinGW que vous pouvez trouver sur mattdm.org/misc/jpeginfo-w32/jpeginfo.exe . J'ai construit cela sur Linux en tant qu'exécutable compilé de manière croisée, donc je ne l'ai pas testé, mais il semblait bien se construire . Je ne peux pas promettre que cela fonctionne, mais je promets que c'est juste le code en amont et qu'il n'y a pas de virus ou quoi que ce soit. :)
mattdm
J'ai voté cela il y a quelques minutes pour l'effort que vous faites, mais cela ne semble pas très bien fonctionner sous Windows. jpeginfo -c any_jpeg_file.jpg Je le fournis, il semble signaler la fin prématurée du fichier JPEG Le flux de données JPEG ne contient aucune image [ERREUR].
Tour
2

ImageVerifier a fait ce que vous vouliez. Malheureusement, il n'est plus disponible au téléchargement et le support a été interrompu le 31 décembre 2017 (voir Ingestamatic et ImageVerifier ne sont plus en vente ).

Ancienne réponse pour des raisons historiques

ImageVerifier (IV pour faire court) traverse une hiérarchie de dossiers à la recherche de fichiers image à vérifier. Il peut vérifier les TIFF, JPEG. PSD, DNG et matières premières non DNG (par exemple NEF, CR2).

IV est conçu pour traiter un grand nombre d'images. Les hiérarchies de dossiers avec 100 000 images ou plus ne devraient pas poser de problème. Dans un essai, IV a fonctionné pendant 14 heures.

Il existe deux types de vérification qu'IV effectue: la vérification de la structure et la vérification du hachage.

http://basepath.com/site/detail-ImageVerifier.php

Kez
la source
Il semble que vous soyez associé à ImageVerifier, si c'est le cas, pouvez-vous le mentionner dans votre réponse.
Maudites vérités
1
Je ne suis pas du tout associé au produit. J'avais besoin de vérifier certains fichiers image après un crash NAS et j'ai utilisé cet outil. Je viens de couper le texte du site pour en donner une description.
Kez
FWIW - Son bon pour les fichiers de l'appareil photo (jpgs et divers formats RAW - sa principale utilisation prévue) mais pas si bon pour d'autres types de fichiers sans codecs, etc. La fonction -identify d'ImageMagick est une autre option
Kez
1

S'il ne s'agit pas de télécharger des images depuis votre appareil photo, mais d'un transfert d'ordinateur à ordinateur, une approche courante de l'intégrité des fichiers est la somme de contrôle .

Malheureusement, pour autant que je sache, les formats d'image "utilisateur final" courants (jpeg, png, gif,…) ne sont pas vérifiés par eux-mêmes. Mais si je comprends bien la question d'impliquer un traitement automatisé, l'intégration d'outils de somme de contrôle ( CRC32 , MD5 ,…) dans le flux de travail pourrait être une solution viable. Une approche commune pour stocker la somme de contrôle est d'avoir un fichier avec le même nom, juste avec une extension supplémentaire, comme: img123.jpg → img123.jpg.md5.

Cette approche présente l'avantage supplémentaire que vous pouvez également vérifier l'intégrité (par exemple) des fichiers side-car ou de tout autre élément que vous souhaitez transférer dans un mécanisme similaire. Et si vous conservez les fichiers de somme de contrôle, même à l'avenir. (Et il a l'inconvénient de ne pas être intégré dans PS, LR ou les autres outils courants dans la mesure de mes connaissances limitées.)

Cornelius
la source
1
Il convient de noter que DNG contient une somme de contrôle et peut être vérifié directement dans Lightroom.
Hampus Nilsson
Je n'étais pas au courant de ça! Excellent. Est également logique. J'ai édité la réponse pour préciser que je visais plus les formats "utilisateur final" que les formats d'archives, bien qu'il soit agréable que DNG aide avec les sommes de contrôle.
Cornelius
J'utilise "Advanced Checksum Verifier" (ACSV) par Irnis Haliullin, pour calculer les fichiers de somme de contrôle MD5 qui sont copiés sur le support de sauvegarde avec les fichiers d'origine. ACSV fonctionne en batch ou interactif. L'intégrité de la copie peut être vérifiée à tout moment en recalculant la somme de contrôle et en la comparant à l'original.
Pierre
1

J'ai développé check_media_integrity un simple script python check_mi.py, vous pouvez le télécharger depuis GitHub:

https://github.com/ftarlao/check-media-integrity

Je cite l'intro du guide:

check-mi est un script Python 2.7 qui vérifie automatiquement l'intégrité des fichiers multimédias (images, vidéo, audio). Vous pouvez vérifier l'intégrité d'un seul fichier ou d'un ensemble de fichiers dans un dossier et des sous-dossiers de manière récursive, enfin vous pouvez éventuellement afficher la liste des fichiers incorrects avec leur chemin et leurs détails au format CSV.

L'outil teste l'intégrité des fichiers à l'aide de bibliothèques communes (Pillow, ImageMagik, FFmpeg) et vérifie s'ils sont effectivement capables de décoder les fichiers multimédias. Les formats d'avertissement, d'image, audio et vidéo sont très résistants aux défauts et dommages pour cette raison, l'outil ne peut pas détecter tous les fichiers endommagés.

check-mi est capable, avec une confiance de 100%, de repérer les fichiers qui ont des en-têtes / métadonnées cassés, des fichiers d'image tronqués (avec strict_level> 0) et des erreurs d'E / S de périphérique.

check-mi n'est généralement pas en mesure de détecter tous les dommages mineurs - par exemple, une petite partie du fichier multimédia écrasée avec des valeurs différentes. En détail, j'ai testé strict_level 1 avec une petite expérience randomisée, exécutée sur une seule image jpeg de 5 Mo:

En écrasant une partie (intervalle) du fichier image avec des zéros, vous avez besoin d'une taille d'intervalle = 1024 Ko pour obtenir 50% de chances de détecter les dommages. En écrasant une partie (intervalle) du fichier image avec différentes valeurs aléatoires, vous obtenez un taux de détection d'environ 85%, pour des tailles d'intervalle allant de 4096 octets à 1024 Ko.

Dans le cas où vous savez comment demander à Pillow, Wand et FFmpeg d'être plus stricts lors du décodage, veuillez me le dire.

Fabiano Tarlao
la source
0

La réponse acceptée fait référence à l'utilisation de jpeginfo, qui est un outil vraiment ancien et non maintenu écrit en C (et aussi pas très modulaire / extensible). En outre, cet outil semble simplement rechercher des points de données EXIF ​​spécifiques (parcourir le code source pendant environ 5 minutes).

IMO, un meilleur outil appelé type de fichier , est très facile à utiliser - en gros, copiez-collez leur exemple de code et modifiez le nom du fichier si vous ne savez pas comment coder. Il vérifie les nombres magiques associés à certains types de fichiers connus et vous permet de savoir quel type de fichier vous traitez.

Je cherche toujours plus de couches de protection que cela. Par exemple, si des données arbitraires sont stockées après (ou dans) les métadonnées EXIF, ou après les nombres magiques, cela peut poser des problèmes de sécurité. Je continuerai à examiner d'autres mesures de sécurité et j'espère mettre à jour cette réponse ultérieurement.

Voici l'exemple de code copié à partir de leur page Web, pour les paresseux:

// Node.js
const readChunk = require('read-chunk');
const fileType = require('file-type');

const buffer = readChunk.sync('unicorn.png', 0, fileType.minimumBytes);

fileType(buffer);
//=> {ext: 'png', mime: 'image/png'}

Pour info, cet outil est constamment mis à jour (il y a 3 jours était la dernière mise à jour, à partir de ma réponse originale ici), et ils ont actuellement 3 691 850 téléchargements hebdomadaires - c'est donc probablement une bonne indication.

user3773048
la source
Les identificateurs de type de fichier basés sur des nombres magiques typiques se concentrent généralement sur les n premiers octets, donc cela peut ne pas aider avec un fichier image partiellement engagé, qui est la base de la question posée ici. C'est-à-dire qu'il est très courant d'avoir un JPEG ou PNG sur lequel POSIX file(qui fonctionne de la même manière) rendra compte correctement, mais échouera au rendu car la plupart des données sont réellement manquantes.