Détecter efficacement le fichier jpeg corrompu?
Est-il un moyen efficace de détecter si un fichier jpeg est corrompu?
Info de base:
des solutions doit travailler dans un script php
les fichiers jpeg sur le disque
la vérification manuelle n'est pas une option (l'utilisateur les données téléchargées)
Je sais que imagecreatefromjpeg(string $filename);
peut le faire. Mais il est assez lent à faire.
Quelqu'un sait plus rapide/la plus efficace des solutions?
source d'informationauteur Jacco
Vous devez vous connecter pour publier un commentaire.
À partir de la ligne de commande vous pouvez utiliser jpeginfo pour savoir si un fichier jpeg est OK ou pas.
Il doit être facile d'appeler jpeginfo à partir de php.
Mon plus simple (et plus rapide) solution:
Note: Ceci n'détecte un fichier endommagé la structure, mais ne détecte PAS corrompu les données de l'image.
Pour info -- j'ai utilisé la méthode ci-dessus (
jpeg_file_is_complete
) pour tester Jpeg que je connais sont corrompus (quand je charge dans un navigateur, par exemple, le fond est gris -- c'est à dire, l'image est "cut off"). De toute façon, quand j'ai couru le test ci-dessus, sur cette image, il NE le détecte PAS comme de la corruption.Jusqu'à présent, à l'aide de
imagecreatefromjpeg()
fonctionne, mais n'est pas très rapide. J'ai trouvé que l'utilisation dejpeginfo
fonctionne aussi bien pour détecter ces types d'images corrompues, et est plus RAPIDE queimagecreatefromjpeg
(j'ai couru une référence dans mon PHP en utilisantmicrotime()
).Merci d'essayer
Juste une petite remarque: comment obtenir jpeginfo pour Windows (64 bits)?
Il n'y a aucune win32/win64 binaires de l'auteur, github, mais vous pouvez le faire:
1) saisir
jpeginfo.exe
à partir de cette archive:https://github.com/MoserMichael/cstuff/raw/master/img-archive/img-archive.zip
2) saisir
cygwin1.dll
à partir de cette archive:ftp://mirror.internode.on.net/pub/cygwin/x86/release/cygwin64/cygwin64-2.6.0-1.tar.xz
Le tester en ligne de commande si cela fonctionne:
jpeginfo --help
. Si il y a de l'info, il fonctionne très bien.Comment tester jpeginfo de sortie?
jpeginfo
retourne 0 si le fichier est ok, mais il renvoie 1 et pas seulement quand il n'est pas, mais aussi quand il a trouvé quelque chose qu'il ne comprend pas. Ensuite, il génère un message comme ceci:Warning: unknown JFIF revision number 2.01 1280 x 720 24bit JFIF N 122550 [WARNING]
Sur des fichiers corrompus il retourne 1 et le message comme ceci:
1328 x 2048 24bit JFIF N 1310080 Premature end of JPEG file [WARNING]
Par conséquent, vous pouvez tester la sortie réelle non seulement code de retour.
Vous pouvez également essayer de générer le fichier hachage basé sur MD5 et l'utiliser comme la somme de contrôle pour valider les données de format JPEG sur les différentes mesures. Par exemple, après la lecture de fichier, puis après le transfert, etc.
Solution:
J'ai trouvé l'outil parfait pour ce dont j'avais besoin:
http://www.thomasbarker.co.uk/2011/05/29/corrupt-jpeg-checkertool-for-finding-corrupt-jpeg-image-files/
Recherches de manière récursive par le biais d'un répertoire et trouve tout corrompu JPEG. Ressemble, vous pouvez utiliser autant de Processeurs que vous le souhaitez à le faire aussi.
A fonctionné pour moi.
J'ai une autre solution avec un simplement getimagesize()