2011-01-24 10 views
12

Ho> 2000 immagini da un flusso di webcam (per un video time-lapse), ho bisogno di cancellare tutte le immagini incomplete & corrotte, prima di passarle a uno script php-gd che le modifica per il video finale.Rilevamento di immagini danneggiate nello script bash

È possibile rilevare file danneggiati con imagemagick o qualche altro strumento? Se provo ad aprire l'immagine corrotta con feh visualizza libpng error: Read Error nella console

Grazie in anticipo!

UPDATE: Sembra che il metodo di identificazione suggerito accetti le immagini errate nel mio caso. Ecco un esempio di quello corrotto http://imgur.com/YcB9n

+0

stesso problema con 'identify' Qui. Accetta immagini che * sono * di fatto incomplete. –

+0

Che cosa significa chiudere questo come "troppo generico" per parlare della ristrettezza degli elettori? Mi sembra una domanda perfettamente adeguata. – mitchus

+0

Per impostazione predefinita, "Identifica" esamina solo l'intestazione dell'immagine e pertanto non rileva il danneggiamento all'interno dei dati dell'immagine. Utilizzare "identifica -verbose" per eseguire la scansione dell'intero file di immagine. –

risposta

13

Prova il comando identify di ImageMagick. Dalla pagina man:

Identificare descrive il formato e caratteristiche di una o più immagini file. Segnalerà inoltre se un'immagine è incompleta o corrotta.

Esempio:

$ identify foo.png 
identify: NotAPNGImageFile (foo.png). 

$ echo $? 
1 

Un'alternativa è di usare PIL (Python Imaging Library):

from PIL import Image 

im = Image.open("foo.png") 
im.verify() 

Dal documentation:

im.verify()

Tenta di determinare se il file è danneggiato, senza effettivamente decodificare i dati dell'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 .

+1

Adoro la riga di comando 'identify'. Grazie mille! Mi hai salvato il mio gluteo! – Atcold

+1

Posso confermare che, come riportato dall'OP, 'identify' accetta spesso anche immagini che sono decisamente incomplete. –

+0

usa il flag -verbose per emettere errori e avvisi – Orhan

4

ho provato il comando ImageMagick identify su un jpg che avevo sparso in giro con diversi tipi di corruzioni gettato in. E 'stato in grado di identificare alcuni, ma non tutti, quindi questo potrebbe essere solo una soluzione parziale al meglio, ma provare questo:

for f in *.JPG ; do identify $f > /dev/null || echo $f >> /tmp/fail ; done ; cat /tmp/fail 
3

a condizione

identify -ping IMAGE_NAME 

ha-diverso da zero codice di ritorno per un'immagine rotto, si può fare questo:

RESULTS_FILE=/tmp/failed_images 
find . -name \*.png -exec identify -ping {} \; -or -exec echo {} \; > $RESULTS_FILE 

In questo modo l'elenco di immagini non riuscite sarà $RESULTS_FILE.Esaminarlo, per esempio, confrontando il numero di risultati nel file con il numero di immagini:

find . -name \*.png | wc -l 
wc -l $RESULTS_FILE 

Quando/se sei felice, cancellare le immagini eseguendo

cat $RESULTS_FILE | xargs rm -f 
+0

Per quelli di voi in futuro, questo cancellò tutte le immagini in una directory per me su Ubuntu 16.04. Probabilmente ha bisogno di un aggiornamento. – crockpotveggies

+0

@crockpotveggies Mi dispiace, ho cambiato i comandi in una versione più sicura. La mia versione originale aveva un avvertimento su rm -f alla fine, ma avrei dovuto sapere che non è abbastanza. –

Problemi correlati