2013-08-28 29 views
9

Próbuję zweryfikować bytearray z Image.open i Image.verify() bez uprzedniego zapisania go na dysku, a następnie otwarcia go za pomocą im = Image.open(). Spojrzałem na metodzie .readfrombuffer() i .readfromstring(), ale muszę rozmiaru obrazu (które mogę dostać tylko przy przeliczaniu bytestream do obrazka).PIL: Konwertuj Bytearray na obraz

My odczytu funkcji wygląda następująco:

def readimage(path): 
bytes = bytearray() 
count = os.stat(path).st_size/2 
with open(path, "rb") as f: 
    print "file opened" 
    bytes = array('h') 
    bytes.fromfile(f, count) 
return bytes 

następnie jako podstawowy test próbuję przekonwertować ByteArray do obrazu:

bytes = readimage(path+extension) 
im = Image.open(StringIO(bytes)) 
im.save(savepath) 

Jeśli ktoś wie, co robię źle lub jeśli istnieje bardziej elegancki sposób konwersji tych bajtów na obraz, który naprawdę mi pomoże.

P.S .: Myślałem muszę ByteArray ponieważ robię manipulacje na bajtów (glitch im obrazy). To zadziałało, ale chciałem to zrobić bez zapisywania go na dysku, a następnie ponownego otwarcia pliku obrazu z dysku, aby sprawdzić, czy jest uszkodzony, czy nie.

Edit: Wszystko to daje mi to IOError: cannot identify image file

+0

Dlaczego nie czytasz obrazu w tablicy numpy? –

+1

@ViktorKerkez, ponieważ chcę manipulować bajtami obrazów. Mam działający kod dla części Manipulation, ale teraz chcę sprawdzić, czy obraz wyjściowy faktycznie nie jest całkowicie zepsuty. Więc mam do pracy z bytearrays – ato

Odpowiedz

10

Jeśli manipulować bytearrays, następnie trzeba użyć io.BytesIO. Możesz także odczytać plik bezpośrednio pod numerem bytearray.

import os 
import io 
import Image 
from array import array 

def readimage(path): 
    count = os.stat(path).st_size/2 
    with open(path, "rb") as f: 
     return bytearray(f.read()) 

bytes = readimage(path+extension) 
image = Image.open(io.BytesIO(bytes)) 
image.save(savepath) 
+0

Dlaczego połowa st_size? I dlaczego w ogóle deklarować "liczyć"? – jdborg

+1

@jdborg Ponieważ OP zrobił to samo w swoim pytaniu. :) Właśnie skopiowałem/wkleiłem kod i naprawiłem błąd. –

+0

Warto również zauważyć, że 'bytes' jest słowem zastrzeżonym w Pythonie –

Powiązane problemy