2013-08-28 14 views
9

Sto provando a verificare un bytearray con Image.open e Image.verify() senza scriverlo prima sul disco e quindi aprirlo con im = Image.open(). Ho esaminato il metodo .readfrombuffer() e .readfromstring(), ma lì ho bisogno della dimensione dell'immagine (che ho potuto ottenere solo durante la conversione di bytestream in un'immagine).PIL: Converti Bytearray in Immagine

La mia lettura Funzione simile a questa:

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 

Poi, come un test di base cerco di convertire il ByteArray a un'immagine:

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

Se qualcuno sa che cosa sto facendo male o se c'è un modo più elegante per convertire quei byte in un'immagine che mi aiuterebbe davvero.

P.S .: Ho pensato di aver bisogno del bytearray perché faccio delle manipolazioni sui byte (glittine le immagini). Questo ha funzionato, ma volevo farlo senza scriverlo sul disco e quindi aprire di nuovo il file immagine dal disco per verificare se fosse rotto o no.

Edit: Tutto ciò che dà me è un IOError: cannot identify image file

+0

Perché non leggi l'immagine in serie numpy? –

+1

@ViktorKerkez perché voglio manipolare i byte delle immagini. Ho un codice funzionante per la parte Manipulation, ma ora voglio verificare che l'immagine in uscita non sia completamente rotta. Quindi devo lavorare con le antenne – ato

risposta

10

Se manipolare con bytearrays, allora dovete usare io.BytesIO. Inoltre puoi leggere un file direttamente su 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

Perché metà dello st_size? E perché dichiarare "contare" a tutti? – jdborg

+1

@jdborg Perché l'OP ha fatto la stessa cosa nella sua domanda. :) Ho appena copiato/incollato il codice e corretto l'errore. –

+0

Potrebbe anche essere utile sottolineare che 'byte 'è una parola riservata in Python –