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
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)