Aggiornare
Ho anche implementato la seguente soluzione nel mio script Python qui su GitHub .
Ho anche verificato che i file danneggiati (jpg) spesso non sono immagini "rotte", ad esempio un file immagine danneggiato a volte rimane un file immagine legittimo, l'immagine originale viene persa o alterata ma puoi comunque caricarla senza errori. Tuttavia, il troncamento del file causa sempre errori.
Fine aggiornamento
È possibile utilizzare il modulo Python Pillow (PIL), con la maggior parte dei formati di immagine, per verificare se un file è un file immagine valido e intatto.
Nel caso si miri a rilevare anche immagini rotte, @Nadia Alramli suggerisce correttamente il im.verify()
metodo, ma questo non rileva tutti i possibili difetti dell'immagine , es. im.verify
Non rileva immagini troncate (che la maggior parte degli spettatori spesso carica con un'area grigia).
Pillow è in grado di rilevare anche questo tipo di difetti, ma è necessario applicare la manipolazione dell'immagine o la decodifica / ricodifica dell'immagine o per attivare il controllo. Infine suggerisco di utilizzare questo codice:
try:
im = Image.load(filename)
im.verify() #I perform also verify, don't know if he sees other types o defects
im.close() #reload is necessary in my case
im = Image.load(filename)
im.transpose(PIL.Image.FLIP_LEFT_RIGHT)
im.close()
except:
#manage excetions here
In caso di difetti dell'immagine questo codice solleverà un'eccezione. Tieni presente che im.verify è circa 100 volte più veloce rispetto all'esecuzione della manipolazione dell'immagine (e penso che il flip sia una delle trasformazioni più economiche). Con questo codice verificherai una serie di immagini a circa 10 MByte / sec con Pillow standard o 40 MByte / sec con modulo Pillow-SIMD (moderna CPU x86_64 da 2,5 Ghz).
Per gli altri formati psd , xcf , .. puoi usare Imagemagick wrapper Wand , il codice è il seguente:
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
Ma, dai miei esperimenti, Wand non rileva immagini troncate, penso che carichi le parti mancanti come area grigia senza chiedere.
Ho letto che Imagemagick ha un comando esterno identificare che potrebbe rendere il lavoro, ma non ho trovato un modo per richiamare quella funzione di programmazione e non ho ancora testato questo percorso.
Suggerisco di effettuare sempre un controllo preliminare, controllare che la dimensione del file non sia zero (o molto piccola), è un'idea molto economica :
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case