SDL/Pygame 利用 cx_Freeze 加载 PNG 图像失败

5 投票
3 回答
2295 浏览
提问于 2025-04-15 22:59

我在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来解决了这个问题,因为它有我需要的一些功能。

3 个回答

0

pillow 来加载图片,而不是用 pygame.image.load

首先,你需要安装 pillow 这个包,然后可以使用下面的函数来加载图片。

 from PIL import Image
    
 def loadImage(img_path):
     img = Image.open(img_path)
     img = img.convert("RGBA")
     return pygame.image.fromstring(img.tobytes(), img.size, "RGBA")
2

我遇到过很多次同样的问题,但我找到了处理的方法。

问题 看起来有两个可能的依赖项发生了冲突。文件 jpeg.dll 是从 JRE 中引入的(在 Windows 上,路径大概是 C:\Program Files\Java\jre6\bin\),但这个文件是错误的。正确的文件应该是从 Pygame 目录引入的,这个目录在你的 Python 安装中,路径是 C:\Python31\lib\site-packages\pygame\。不过我不知道为什么 cx_Freeze 更倾向于使用 JRE 中的那个文件……

怎么解决这个问题? 其实很简单。只需把正确的文件(也就是 Pygame 中的那个)复制到你运行 cx_Freeze 脚本的目录下。当你启动脚本时,它会先在当前目录查找,然后找到正确的 jpeg.dll。这样你的可执行文件就可以导入 PNG 图片了。

1

通过插入一些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"

撰写回答