SDL/Pygame 利用 cx_Freeze 加载 PNG 图像失败
我在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.dll
和libpng12-0.dll
这两个文件都被cx_Freeze放到了我的构建目录里,所以我觉得应该没问题。为什么它还是无法加载PNG图片呢?
补充:我通过把我的脚本移植到Python 2.6,并使用py2exe来解决了这个问题,因为它有我需要的一些功能。
3 个回答
用 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")
我遇到过很多次同样的问题,但我找到了处理的方法。
问题
看起来有两个可能的依赖项发生了冲突。文件 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 图片了。
通过插入一些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"