【问题标题】:Python 2.7 display jpeg image contained in zip filePython 2.7 显示 zip 文件中包含的 jpeg 图像
【发布时间】:2015-08-21 09:57:54
【问题描述】:

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

我在创建 Image 对象时遇到问题。我尝试将 ZipFile.open() 和 ZipFile.read() 的输出提供给 Image() 和 PhotoImage(),所有这些都会导致相同的错误消息:“UnsupportedOperation: seek”。 Documentation for 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 文件的相关帖子。我知道我的 zip 格式正确,因为我可以在 Java 和 Perl 中使用相同的文件执行此操作(我正在用 Python/Tk 重写一个大型 Java 应用程序)。

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

请帮忙。

【问题讨论】:

  • 另外你应该添加python标签来拥有更多的读者......
  • Eric:我看过那个帖子;它没有帮助,但谢谢。我通过将 ZipFile.read(membername) 提供给 BytesIO 解决了我的问题,BytesIO 返回一个可查找的内存文件。 Image.open 接受它,之后的一切都很容易。我欢迎任何其他解决方案。
  • 如果您找到了解决方案,那么最好将其发布为答案。

标签: python python-2.7 tkinter zip jpeg


【解决方案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 中找到了安装说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2012-06-30
    相关资源
    最近更新 更多