2009-05-20 20 views
60

Attualmente sto usando PIL.Come verificare se un file è un file immagine valido?

from PIL import Image 
try: 
    im=Image.open(filename) 
    # do stuff 
except IOError: 
    # filename not an image file 

Tuttavia, mentre questo copra sufficientemente maggior parte dei casi, non sono state rilevate alcune file di immagine come, XCF, SVG e PSD. I file Psd generano un'eccezione OverflowError.

C'è qualche modo per includerli?

+19

Non è pratica particolarmente diffusa per chiudere i duplicati attraverso diversi linguaggi. Se non riesci a trovare altre domande su Python, lasciatelo aperto in quanto potrebbero esserci soluzioni specifiche di Python che le persone vogliono pubblicare che non sono state inviate alla domanda che hai postato. –

+0

sì, prima di tutto speravo davvero in una lib di python che non conoscevo: P e poi, come ben sottolineato, solo i numeri magici non convalidano l'intera immagine. – Sujoy

+0

@ Divertiti, convalidare un'intera immagine è quasi impossibile, a meno che tu non ne abbia già una copia, perché il computer non può dire la differenza tra un pixel di colore corretto e un set alterato di 1 e 0, purché tutto il controllo (numeri magici) sono corretti. – DevinB

risposta

8

Un sacco di volte il primo paio di caratteri sarà un numero magico per vari formati di file. Puoi controllare questo oltre alla tua eccezione controllando sopra.

+4

Non sarà sufficiente se sta veramente testando immagini "valide"; la presenza di un numero magico non garantisce che il file non sia stato troncato, ad esempio. –

+0

ottimi consigli, ora ho solo bisogno di capire quali sono quei numeri. grazie :) – Sujoy

+0

@ben, ahi non ci ho ancora pensato. questo è davvero un buon punto – Sujoy

1

Controllare le estensioni dei file è accettabile o stai cercando di confermare che i dati stessi rappresentino un file immagine?

Se è possibile controllare l'estensione del file, un'espressione regolare o un semplice confronto potrebbero soddisfare il requisito.

+0

semplicemente controllare l'estensione non è sufficiente, in quanto si può rinominare un file txt come jpg o qualcosa del genere. Suppongo che, se non trovassi alcuna soluzione, solo allora userò il controllo dell'estensione per xcf e svg – Sujoy

+0

Comprensibile, speravo solo in qualche chiarimento prima di procedere a escogitare una soluzione che potesse adattarsi meglio alle tue esigenze. Grazie! – doomspork

2

Beh, non so l'interno di psd, ma io, certo, so che, in effetti, svg non è un file immagine di per sé, - è basato su xml, quindi è , in sostanza, un file di testo semplice.

+0

aha, hai ragione. è xml. tuttavia, contiene alcuni dati immagine incorporati in esso. – Sujoy

2

Su Linux, è possibile utilizzare python-magic (http://pypi.python.org/pypi/python-magic/0.1) che utilizza libmagic per identificare i formati di file.

per quanto ne so, libmagic indaga il file e cerca di dirvi di più su di esso che solo il formato, come le dimensioni bitmap, versione del formato, ecc .. Così si potrebbe vedere questo come un test superficiali per "validità".

Per altre definizioni di "valido" potrebbe essere necessario scrivere i propri test.

28

Oltre a ciò che Brian suggerisce, è possibile utilizzare il metodo PIL verify per verificare se il file è danneggiato.

im.verify()

tenta di determinare se il file è rotto, senza effettivamente decodifica dei dati di immagine . Se questo metodo rileva problemi , solleva le eccezioni appropriate. Questo metodo funziona solo su un'immagine di nuova apertura; se l'immagine ha già già caricata, il risultato è indefinito. Inoltre, se è necessario caricare l'immagine dopo aver utilizzato questo metodo, è necessario riaprire il file immagine . Attributi

+0

bene il problema principale è che i file svg, xcf e psd non possono essere aperti con Image.open() quindi, nessuna possibilità di verificare con im.verify() – Sujoy

+11

Mio dio la documentazione del PIL è terribile. Che cosa è esattamente una "eccezione adatta"? – Timmmm

+0

Ecco il link alla [Documentazione del cuscino per Image.verify()] (https://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.verify). Sfortunatamente, non è migliore, e sembra che abbiano appena alzato il paragrafo sopra senza aggiungere nulla. –

3

È possibile utilizzare i collegamenti Python in libmagic, python-magic e quindi controllare i tipi di mimo. Questo non ti dirà se i file sono corrotti o intatti ma dovrebbe essere in grado di determinare il tipo di immagine che è.

134

Ho appena trovato il modulo integrato imghdr. Dalla documentazione python:

Il modulo imghdr determina il tipo di immagine contenuta in un file o di byte flusso.

Questo è come funziona:

>>> import imghdr 
>>> imghdr.what('/tmp/bass') 
'gif' 

Utilizzando un modulo è molto meglio di reimplementare funzionalità simili

+1

sì imghdr funziona per la maggior parte dei formati di immagine, ma non tutti. come per il mio problema originale con i file svg, xcf e psd, beh quelli non vengono rilevati anche in imghdr – Sujoy

+0

Sì, ma invece di reinventare la ruota, c'è qualcosa da cui iniziare. –

+0

È possibile ad esempio rifiutare le intestazioni di immagini non rilevate. Se l'immagine non è stata rilevata da imghdr, probabilmente non è supportata nemmeno da PIL. Oppure puoi iniziare guardando il codice sorgente di imghdr e vedere come funziona. –

Problemi correlati