Python 2.7显示zip文件中包含的jpeg图像

时间:2015-06-06 13:51:23

标签: python python-2.7 tkinter zip jpeg

我在zip存档中有一组jpeg文件。我想在Tkinter小部件中显示成员jpeg图像。

我在创建Image对象时遇到了问题。我已经尝试将ZipFile.open()和ZipFile.read()的输出提供给Image()和PhotoImage(),所有这些都会导致相同的错误消息:" UnsupportedOperation:seek"。 Image.open()的Documentation表示如果给出一个文件对象作为参数,则该文件对象必须支持read,seek和tell方法。显然是"类文件对象"由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

我找不到任何与zipped jpeg文件有关的帖子。我知道我的拉链格式正确,因为我可以在Java和Perl中使用相同的文件执行此操作(我正在用Python / Tk重写大型Java应用程序)。

一种强力方法是将成员文件提取到磁盘,然后简单地调用Image(路径名),但我宁愿在内存中做所有事情。

请帮助。

1 个答案:

答案 0 :(得分:1)

我能够从(不可搜索的)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中找到了安装说明。