2015-06-06 2 views
1

У меня есть набор jpeg-файлов в zip-архиве. Я хотел бы отобразить jpeg-образ элемента в виджете Tkinter.Python 2.7 отображает изображение jpeg, содержащееся в zip-файле

У меня возникли проблемы с созданием объекта изображения. Я попытался подавать выходные данные ZipFile.open() и ZipFile.read() в Image() и PhotoImage(), все из которых приводят к тому же сообщению об ошибке: «UnsupportedOperation: seek». Documentation для Image.open() указывает, что если файловый объект указан как аргумент, объект файла должен поддерживать методы чтения, поиска и рассылки. По-видимому, «файл-подобный объект», возвращаемый ZipFile.open(), не подходит.

zfile = zipfile.ZipFile(filename,'r') 
... 
filelikeobject = zfile.open(membername,'r') 
image = Image.open(filelikeobject) 

File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1967, in open 
fp.seek(0) 
UnsupportedOperation: seek 

Я не могу найти соответствующее сообщение, касающееся файлов jpeg с zipped. Я знаю, что мои почтовые индексы хорошо сформированы, потому что я могу выполнить эту операцию, используя те же файлы, в Java и Perl (я переписываю большое приложение Java в Python/Tk).

Метод грубой силы заключается в извлечении файла-члена на диск и просто вызове Image (pathname), но я предпочел бы делать все в памяти.

Любая помощь, пожалуйста.

+0

Может ли http://stackoverflow.com/questions/12821961/seek-a-file-within-a-zip-file-in-python-without-passing-it-to-memory помочь вам? –

+0

Также вы должны добавить тег python, чтобы иметь больше читателей ... –

+0

Эрик: Я видел этот пост; это не помогает, но спасибо. Я решил свою проблему, подав ZipFile.read (membername) в BytesIO, который возвращает файл с возможностью поиска. Image.open принимает его, и все после этого легко. Я приветствую любые другие решения. – fossildoc

ответ

1

Я был в состоянии создать доступный для поиска файла памяти из (nonseekable) объекта ZipFile следующим образом:

from io import BytesIO 
import zipfile 
from PIL import Image, ImageTk 
... 
zfile = zipfile.ZipFile(filename,'r') # non-seekable 
memberlist = zfile.namelist() 
... 
zfiledata = BytesIO(zfile.read(membername)) # seekable 
image = Image.open(zfiledata) # image.show() will display 
photo = ImageTk.PhotoImage(image) 

фотография может быть использована в любом виджете Tk, который принимает изображение объекта (например, холст, этикетки и т. д.)

При первой попытке приведенного выше кода у меня появилось сообщение об ошибке в файлах. По-видимому, ImageTk не входит в стандартную установку 2.7. Инструкции по его установке я нашел в SO post.

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