SDL/Pygame 无法使用 cx_Freeze 加载 PNG 图像

Posted

技术标签:

【中文标题】SDL/Pygame 无法使用 cx_Freeze 加载 PNG 图像【英文标题】:SDL/Pygame failing to load PNG images with cx_Freeze 【发布时间】:2010-05-21 15:06:09 【问题描述】:

我在 Windows 上运行 Python 3.1,并尝试通过 cx_Freeze 将我的 Pygame 脚本作为可执行文件分发。现在它似乎正在工作,只是 exe 构建无法加载我的任何图像:

Cannot load image: C:\path\to\build\exe.win32-3.1\resources\image.png
File is not a Windows BMP file

谷歌搜索发现,当 SDL 图像库未正确包含时会发生这种情况。但是,SDL_image.dlllibpng12-0.dll 都被 cx_Freeze 放入了我的构建目录,所以在我看来一切都应该没问题。为什么不能加载PNG图片?

编辑:我通过将我的脚本移植到 Python 2.6 并改用 py2exe “解决”了这个问题,因为它有一些我需要的功能。

【问题讨论】:

冻结前是否有效?如果将文件转换为 .bmp 会发生什么? 是的,它在冻结之前工作得非常好。如果我将图像转换为 .bmp,它们可以正常加载,但如果可能的话,我宁愿选择使用 .png。 【参考方案1】:

我多次遇到同样的问题,但我发现了如何处理它。

问题 似乎两个可能的依赖关系之间存在冲突。文件jpeg.dll 包含在JRE 中(在Windows 上,类似于C:\Program Files\Java\jre6\bin\),但它是错误的。它应该包含在 Python 安装中的 Pygame 目录中,地址为 C:\Python31\lib\site-packages\pygame\。不知道为什么 cx_Freeze 更喜欢 JRE 中的那个,不过……

如何解决? 这很容易。只需将正确的文件(来自 Pygame 的文件)复制到执行 cx_Freeze 脚本的目录。当您启动它时,脚本将首先查看当前目录,并找到正确的jpeg.dll。您的可执行文件现在应该可以导入 PNG 图像了。

【讨论】:

【参考方案2】:

通过插入一些 python 代码进行测试,以显示一条指示库已加载的消息和另一条指示它们的加载导致错误的消息。

try:
   import SDL_image
   print "Loaded SDL_image"
except:
   print "Failed to import SDL_image"

try:
   import libpng
   print "Loaded libpng"
except:
   print "Failed to import libpng"

【讨论】:

我不再使用 cx_freeze(请参阅上面的编辑),但我会接受这个作为答案。

以上是关于SDL/Pygame 无法使用 cx_Freeze 加载 PNG 图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 cx_Freeze 时出现问题:“无法导入名称 'tf2'”

无法使用 virtualenv 和 cx_Freeze 将 pygame 转换为可执行文件

无法使用 cx_freeze 和 PySide2 进行编译

cx_Freeze 无法使用 pandas 构建 msi

cx_freeze 可执行文件无法与 Geckodriver 配合使用

cx_freeze 使 selenium 无法在 python 中截屏