Ich habe die Option eingestellt:
Code: Select all
ImageFile.LOAD_TRUNCATED_IMAGES = True
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]
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).
Mobile version