我该如何解决这个错误:TypeError: argument 1 must be pygame.Surface, not PngImageFile。

3
我曾经使用过Python 2.7pygame来加载PNG并将其blit到一个表面上,这段代码足以实现:
sprites = pygame.image.load('sprites.png')
background.blit(sprites, (0, 0), rect)

我现在正在使用Python 3,这意味着我需要加载PIL来处理PNG文件。我的新代码如下:

from PIL import Image
sprites = Image.open('sprites.png')
background.blit(sprites, (0, 0), rect)

但是当我运行新代码时,我在最后一行收到了这个错误信息:
TypeError: argument 1 must be pygame.Surface, not PngImageFile 因此,变量“sprites”是一个“PngImageFile”,而“background.blit()”需要一个“pygame.Surface”对象作为输入:
- 我应该将“PngImageFile”转换为“pygame.Surface”吗?我找不到任何方法来做到这一点。 - 是否有更好的方法将PIL图像“blit”到“pygame.Surface”对象上?
我在StackOverflow上努力寻找答案,所以我很确定这不是重复的问题。任何意见或建议都非常欢迎。

抱歉,但是你是如何让PIL与Python3一起工作的?他们甚至还没有发布它吧?o0 - Torxed
此外,可以从字符串中将图像加载到pygame图像中:http://www.pygame.org/docs/ref/image.html#pygame.image.fromstring - Torxed
1
有一个叫做pillow的分支,它似乎可以工作,请让我知道如果您需要进一步的细节。 - user1115363
1个回答

2
from PIL import Image
sprites = Image.open('sprites.png')
pygameImage = pygame.image.fromstring(str(buffer(sprites)), win.size, 'RGB', False)
background.blit(pygameImage, (0, 0), rect)

由于我在Python3上没有安装PIL,所以我不确定这个方法是否能直接运行。你需要获取sprites对象的文本表示,而不是数据数组。
以下方法可能有助于将PIL对象转换为字符串: 或者简单尝试一下:
from PIL import Image
sprites = pygame.image.load(Image.open('sprites.png'))
background.blit(sprites, (0, 0), rect)

第三行稍作修改,目前是这样的:pygameImage = pygame.image.fromstring(sprites.tostring(), len(sprites.tostring()), 'RGB', False)但我得到了这个错误:TypeError: 必须是2项序列,而不是整数有什么想法吗? - user1115363
@hertsmael 可能是因为 size=...(如果你在 pygame.image.fromstring 的文档中阅读,它需要宽度+高度,而不是表示图像的字符串的长度)。尝试使用 pygameImage = pygame.image.fromstring(sprites.tostring(), (sprites.width, sprites.height), 'RGB', False) 代替。 - Torxed
由于我在PngImageFile对象中找不到正确的方法来获取宽度和高度,所以我只是将它们硬编码(只是为了尝试使其工作)。 我得到的错误是:pygameImage = pygame.image.fromstring(sprites.tostring(), (760, 166), 'RGB', False)ValueError: String length does not equal format and resolution size http://pastebin.com/QpuEwPc0 - user1115363

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接