2010-03-05 22 views
1

J'ai écrit un programme pour traiter un tas de fichiers png qui sont générés par un processus séparé. La capture fonctionne principalement, mais il y a des moments où le processus meurt et redémarre ce qui laisse une image corrompue. Je n'ai aucun moyen de détecter quand le processus meurt ou quel fichier il meurt (il y a ~ 3000 fichiers png).Un moyen efficace de détecter les fichiers png corrompus?

Existe-t-il un bon moyen de vérifier un fichier png corrompu?

+2

"Je n'ai aucun moyen de détecter quand le processus meurt ou sur quel fichier il meurt" - Pourquoi? –

Répondre

3

une autre solution possible serait de modifier légèrement la façon dont votre processeur traite les fichiers: Faites-le toujours créer un fichier nommé temp.png (par exemple), puis le renommer à la "correct" nom une fois que c'est fait. De cette façon, vous savez s'il y a un fichier nommé temp.png, le processus est interrompu, alors que s'il n'y a pas de fichier, tout est bon.

(un schéma de nommage variante serait de faire ce que le téléchargeur de Firefox ne -. Append .partial au vrai nom de fichier pour obtenir le nom temporaire)

3

Une sorte de hack, mais fonctionne Si vous utilisez Linux ou quelque chose comme vous pourriez avoir la commande « convertir »

$ convert --help 
Version: ImageMagick 5.5.6 04/01/03 Q16 http://www.imagemagick.org 
Copyright: Copyright (C) 2003 ImageMagick Studio LLC 

Usage: convert [options ...] file [ [options ...] file ...] [options ...] file 

Si vous faites une .png non valide, et puis essayer de convertir, vous « ll obtenir une erreur:

$ date> foo.png 
$ convert foo.png foo.gif 
convert: NotAPNGImageFile (foo.png). 
+0

Est-ce que imagemagick échouera toujours si le png a un en-tête valide? – rook

+0

oui, on dirait que vous pouvez corrompre un png à certains égards qui causent la conversion de ne pas se plaindre. (comme faire un "echo corrupt >> valid.png" et faire une conversion). – mlathe

3

Puisque vous êtes sur un système Linux, vous avez probablement déjà Python installée.

Un moyen facile serait d'essayer de charger et de vérifier les fichiers avec PIL (Python Imaging Library) (vous aurez besoin d'installer ce premier).

from PIL import Image 

v_image = Image.open(file) 
v_image.verify() 

(pris mot pour mot de my own answer in this thread)

2

Je sais c'est une question à partir de 2010, mais je pense que cela est une meilleure solution: pngcheck.

Questions connexes