2013-08-28 5 views
9

Я пытаюсь проверить bytearray с Image.open и Image.verify(), не записывая его сначала на диск, а затем откройте его с помощью im = Image.open(). Я посмотрел на методы .readfrombuffer() и .readfromstring(), но там мне нужен размер изображения (который я мог получить только при преобразовании байтового потока в изображение).PIL: Преобразование Bytearray в изображение

Мои чтения Функция выглядит следующим образом:

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 

Тогда как основной тест, который я пытаюсь преобразовать ByteArray к изображению:

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

Если кто-то знает, что я делаю неправильно или если есть более элегантный способ конвертировать эти байты в изображение, которое действительно поможет мне.

P.S .: Я думал, что мне нужен bytearray, потому что я делаю манипуляции по байтам (сбой их изображений). Это действительно работало, но я хотел сделать это, не записывая его на диск, а затем снова открывая файл образа с диска, чтобы проверить, не сломался он или нет.

Edit: Все это дает мне это IOError: cannot identify image file

+0

Почему вы не читаете изображение в массив numpy? –

+1

@ViktorKerkez, потому что я хочу манипулировать байтами изображений. У меня есть рабочий код для части Manipulation, но теперь я хочу проверить, что выходное изображение на самом деле не полностью сломано. Так что я должен работать с bytearrays – ato

ответ

10

Если манипулировать с bytearrays, то вы должны использовать io.BytesIO. Также вы можете прочитать файл непосредственно на 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

Почему вы наполовину st_size? И зачем вообще объявлять 'count'? – jdborg

+1

@jdborg Потому что ОП сделал то же самое в своем вопросе. :) Я просто копировал/вставлял код и исправлял ошибку. –

+0

Также стоит отметить, что 'bytes' является зарезервированным словом в Python –

Смежные вопросы