Windows 7上Activestate的pil png不支持ZLIB (PNG/ZIP)

2 投票
2 回答
3843 浏览
提问于 2025-04-17 03:27

我正在尝试把一个Python程序从OS X移植到Windows 7。这个程序使用tkinter处理png文件,比如:

self.logoImg = ImageTk.PhotoImage(Image.open('GrowthPathLogo.png'))

但是代码出错了,提示 IOError: decoder zip not available

我试着用pypm安装pip。然后我又尝试用pip来构建它。结果在构建的最后,报告说没有对png/zlib的支持。

我在Windows上用python.org的安装包也遇到了同样的错误。

我现在卡住了,我对构建C库不太在行,也不太懂pip是怎么工作的。我虽然安装了gnu zlib库,但这并没有什么帮助。我有安装Visual C++ 2008 Express,至少这个是能用的,因为pip确实能成功编译一些东西。

2 个回答

5

我知道这个问题已经有点老了,但我想分享我的解决办法,以防有人遇到和我一样的问题。

Christoph Gohlke 提供的构建版本非常棒,但前提是它们能正常工作。不过,对于我这台运行 Windows 7、使用 Python 2.7,最重要的是 64 位的机器来说,网页上没有带 PNG 支持(也就是 zlib 支持)的预编译版本。那个页面上的 Pillow 64 位版本在使用 easy_install 时失败,无法在我的机器上安装。

所以,如果你想解决这个问题,而现有的二进制文件又无法使用,你需要自己编译 Pillow,并且要确保它有 zlib 支持。为此,你需要下载最新的 Pillow 源代码。

在 setup.py 文件中,把 ZLIB_ROOT 这一行修改为:

ZLIB_ROOT = './zlib'

接下来,你还需要为 64 位 Windows 编译 zlib,这部分比较复杂。你可以从 zlib 的官网上下载最新的源代码(我测试的是 1.2.5 和 1.2.8 版本)。

打开 64 位的 Visual Studio 命令提示符(这一步非常重要),我的命令提示符叫做 VS2012 x64 Cross Tools Command Prompt。

进入 zlib 的源代码目录,然后运行:

nmake -f win32/Makefile.msc

如果不成功,可以尝试:

nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF" OBJA="inffasx64.obj gvmat64.obj inffas8664.obj"

现在你应该在源代码目录中看到以下文件:

zlib.h
zconf.h
zutil.h (not sure this is needed)
zlib.lib
zdll.lib

把这些文件复制到 Pillow 的源代码目录下,放在一个叫做 "zlib" 的文件夹里。然后使用 "python setup.py build_ext -i" 来编译 Pillow,接着用 "python setup.py install" 来安装 Pillow。

现在 Pillow 应该可以正常使用 zlib(png)支持了。如果你有一些旧版本的 Pillow/PIL 安装,可能需要手动把 _imaging.pyd 和 _imagingmath.pyd 复制到你的 Python 或虚拟环境的包安装文件夹里,以确保使用的是新编译的文件。

现在你可以导入 _imaging,并且可以使用 png 支持了。

如果需要的话,你也可以用同样的方法手动编译 Libjpeg。

希望这能帮助到遇到这个问题的人。

7

可以试试这个链接 这里,里面有一个由Christoph Gohlke维护的版本。如果你想自己编译PIL(Python Imaging Library),你需要一些库,README里有提到:libjpeg、zlib、freetype2和littleCMS。关于如何在Visual C++或MinGW中链接zlib的说明,可以查看 zlib125-dll.zip 里的USAGE.txt。

撰写回答