Frage Gibt es eine Möglichkeit, in Python (oder einer anderen Sprache) festzustellen, ob ein JPG-Bild beschädigt ist?


Ich habe mich gefragt, ob es eine Möglichkeit gibt, in Python (oder einer anderen Sprache) eine JPEG-Datei zu öffnen und festzustellen, ob sie beschädigt ist oder nicht (wenn ich zum Beispiel einen Download für eine JPG-Datei abschließe) kann ich die Datei nicht öffnen und anzeigen)? Gibt es Bibliotheken, die dies leicht machen?


5
2017-08-21 08:56


Ursprung


Antworten:


Sie können versuchen, PIL zu verwenden. Aber nur eine abgeschnittene JPG-Datei zu öffnen wird nicht fehlschlagen, und auch nicht verify Methode. Der Versuch, es zu laden, wird jedoch eine Ausnahme auslösen;

Zuerst zerlegen wir eine gute jpg-Datei:

> du mvc-002f.jpg
56  mvc-002f.jpg
> dd if=mvc-002f.jpg of=broken.jpg bs=1k count=20
20+0 records in
20+0 records out
20480 bytes transferred in 0.000133 secs (154217856 bytes/sec)

Dann probieren wir die Python Imaging Library aus:

>>> import Image
>>> im = Image.open('broken.jpg')
>>> im.verify()
>>> im = Image.open('broken.jpg')  # im.verify() invalidates the file pointer
>>> im.load()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/PIL/ImageFile.py", line 201, in load
    raise IOError("image file is truncated (%d bytes not processed)" % len(b))
IOError: image file is truncated (16 bytes not processed)

Wie Benutzer827992 sagte, kann selbst ein abgeschnittenes Bild in der Regel immer noch teilweise decodiert und angezeigt werden.


6
2017-08-21 09:40



Sie könnten es mit PIL-Paket tun:

import Image

def is_image_ok(fn):
    try:
        Image.open(fn)
        return True
    except:
        return False

0
2017-08-21 09:07



Ich denke nicht.

Der JPEG-Standard ist eher ein Container als ein Standard über die Implementierung.

Das beschädigte Wort bedeutet normalerweise, dass die Datei nicht länger die Originaldaten darstellt, aber die meiste Zeit kann noch entschlüsselt werden, es wird eine undefinierte Ausgabe erzeugt, nicht die, die produziert werden soll, aber höchstwahrscheinlich in einen JPEG-Decoder eingefügt Da es keine Möglichkeit gibt, dem JPEG-Dateiformat eine eindeutige Bit-Anordnung zuzuordnen, können Sie dies programmatisch nicht tun, Sie haben kein spezifisches Muster und selbst wenn Sie es haben, können Sie das nicht sagen ein bisschen ist der falsche Ort oder fehlt, ohne zu wissen, was der ursprüngliche Inhalt ist, wenn nur die eigentliche Datei analysiert wird.

Auch der Header der Datei kann beschädigt sein, aber in diesem Fall wird Ihre Datei wahrscheinlich als beschädigt bezeichnet, ohne sich um "was ist" kümmern, ist beschädigt, wie jede generische Datei sein kann.


0
2017-08-21 09:08