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

标签 python python-2.7 tkinter zip jpeg

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

我在创建 Image 对象时遇到问题。我尝试将 ZipFile.open() 和 ZipFile.read() 的输出提供给 Image() 和 PhotoImage(),所有这些都会导致相同的错误消息:“UnsupportedOperation:seek”。 Documentation for Image.open() 指出,如果给出文件对象作为参数,则该文件对象必须支持 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

我找不到任何处理压缩 jpeg 文件的相关帖子。我知道我的 zip 格式良好,因为我可以使用相同的文件在 Java 和 Perl 中执行此操作(我正在用 Python/Tk 重写一个大型 Java 应用程序)。

一种强力方法是将成员文件提取到磁盘,然后简单地调用 Image(pathname),但我宁愿在内存中完成所有操作。

请提供任何帮助。

最佳答案

我能够从(不可查找的)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)

照片可以在任何采用图像对象(例如 Canvas 、标签等)的 Tk 小部件中使用

在我第一次尝试上述代码时,我收到一条有关丢失文件的错误消息。显然 ImageTk 不是标准 2.7 安装的一部分。我在 SO post 中找到了安装它的说明.

关于Python 2.7显示zip文件中包含的jpeg图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30683660/

相关文章:

python - 如何使用 C Python API 从 C 注入(inject) Python 中的可捕获异常?

python - 我可以在不关闭 python 的情况下保存文本文件吗?

python-2.7 - 如何让FeatureUnion返回Dataframe

python - 在 python 中将输入文件读取为 csv

python - 是否可以获取 tkinter 文本中标记的数字索引(位置)?

python - 如果我的 JSON 数据被读取为列表而不是 Python 字典,可以吗?

python - 装饰类方法以构建方法注册表

python - 中世纪字符的 UnicodeDecodeError

python - 将变量传递给 Tkinter 几何方法

python-3.x - python3 tkinter 或 ncurses