Arbeiten mit abgeschnittenen Bildern mit PILPython

Python-Programme
Anonymous
 Arbeiten mit abgeschnittenen Bildern mit PIL

Post by Anonymous »

Ich versuche, die Python 2.7 PIL-Bibliothek dazu zu bringen, mit JPEG-Bildern zu arbeiten, die nur als Stream von einem Festplattenbild verfügbar und unvollständig sind.

Ich habe die Option eingestellt:

Code: Select all

ImageFile.LOAD_TRUNCATED_IMAGES = True
Und lade den Stream, soweit er verfügbar ist (oder besser gesagt: soweit ich zu 100 % sicher bin, dass es sich bei diesen Daten noch um ein Bild handelt, nicht um einen anderen Dateityp). Ich habe verschiedene Dinge getestet und soweit ich das beurteilen kann (für JPEGs), akzeptiert PIL es nur dann als gültiges JPEG-Bild, wenn es den 0xFFDA (Start of Scan Marker) findet. Dies ist ein kurzes Beispiel dafür, wie ich die Daten lade:

Code: Select all

from PIL import Image
from StringIO import StringIO

ImageFile.LOAD_TRUNCATED_IMAGES = True

with open("/path/to/image.raw", 'rb') as fp:
fp.seek("""jump to position in image where JPEG starts""")
data = fp.read("""number of bytes I know that those belong to that jpeg""")
img = Image.open(StringIO(data)) # This would throw exception if the data does
# not contain the 0xffda marker
pixel = img.load()               # Would throw exception if LOAD_TRUNCATED_IMAGES = false

height,width = img.size
for i in range(height):
for j in range(width):
print pixel[i,j]
In der allerletzten Zeile habe ich erwartet (oder gehofft), dass zumindest die gelesenen Pixeldaten angezeigt werden. Aber für jedes Pixel wird (0,0,0) zurückgegeben.

Die Frage: Ist das, was ich hier versuche, mit PIL nicht möglich?

Vor einigen Wochen habe ich dasselbe mit einer Bilddatei versucht, die ich selbst abgeschnitten habe, indem ich einfach mit einem Editor Daten daraus ausgeschnitten habe. Es funktionierte mit den verfügbaren Pixeldaten. Sobald ein Pixel erreicht wurde, das ich abgeschnitten hatte, löste das Programm eine Ausnahme aus (ich werde es heute noch einmal versuchen, um sicherzustellen, dass ich mich nicht falsch erinnere).

Wenn sich jemand fragt, warum ich das mache: Ich muss sicherstellen, dass das Bild/Bild in diesem Festplattenbild in aufeinanderfolgenden Blöcken/Clustern vorliegt und nicht fragmentiert ist. Um dies sicherzustellen, wollte ich Pixel-Matching verwenden.

BEARBEITEN:
Ich habe es noch einmal versucht und das ist, was ich gesehen habe.
  • Ich habe ein abgeschnittenes Bild in GIMP geöffnet und es zeigte mir im oberen Teil ein paar Pixellinien, aber PIL konnte mir nicht zumindest die RGB-Werte dieser Pixel liefern. Es wird immer (0,0,0) zurückgegeben.
  • Ich habe das Bild etwas größer gemacht, sodass die unteren 4/5 des Bildes nicht sichtbar waren, aber das reichte für PIL aus, um mir die verfügbaren RGB-Werte anzuzeigen. Alles andere war (0,0,0).
Ich bin immer noch nicht 100 % sicher, ob PIL mir die RGB-Werte anzeigen kann, auch wenn nur Ansichtspixeldaten verfügbar sind.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post