web-dev-qa-db-fra.com

PIL: convertir Bytearray en image

J'essaye de vérifier un bytearray avec Image.open Et Image.verify() sans l'écrire d'abord sur le disque puis l'ouvrir avec im = Image.open(). J'ai regardé la méthode .readfrombuffer() et .readfromstring(), mais là, j'ai besoin de la taille de l'image (que je ne pouvais obtenir que lors de la conversion du bytestream en image).

Ma fonction de lecture ressemble à ceci:

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

Ensuite, en tant que test de base, j'essaie de convertir le bytearray en une image:

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

Si quelqu'un sait ce que je fais mal ou s'il existe un moyen plus élégant de convertir ces octets en une image qui m'aiderait vraiment.

P.S .: Je pensais avoir besoin du bytearray parce que je fais des manipulations sur les octets (glitch les images). Cela a fonctionné, mais je voulais le faire sans l'écrire sur le disque, puis ouvrir à nouveau le fichier image à partir du disque pour vérifier s'il est cassé ou non.

Edit: Tout ce qu'il me donne est un IOError: cannot identify image file

22
ato

Si vous manipulez avec bytearrays, vous devez utiliser io.BytesIO. Vous pouvez également lire un fichier directement dans un 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)
32
Viktor Kerkez