2

我用Python 2.7pygame,并加载PNG和blit它的表面,该代码已经足够:如何解决此错误:类型错误:参数1必须pygame.Surface,不PngImageFile

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变量是一个PngImageFilebackground.blit()期待一个pygame.Surface对象作为输入:

  • 我应该转换PngImageFilepygame.Surface?我找不到任何方法来做到这一点。
  • 有没有更好的办法来blit一个PIL图像到一个pygame.Surface对象?

我试过很难在StackOverflow上寻找答案,所以我很确定这不是一个重复的问题。任何意见或建议将非常受欢迎。

+0

抱歉,你是怎么PIL与Python3工作..他们甚至没有带它发布了吗? o0 – Torxed

+0

此外,将图像从字符串加载到pygame图像中:http://www.pygame.org/docs/ref/image.html#pygame.image.fromstring – Torxed

+1

有一个叫做枕头的叉子,它似乎工作,让我知道如果你需要进一步的细节 – hertsmael

回答

1
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) 
+0

第三行,略有修改,目前是这样的: pygameImage = pygame.image.fromstring(sprites.tostring(),len(sprites.tostring()), 'RGB',FALSE) 但我得到这个: 类型错误:必须是2项序列,不是int 任何想法? – hertsmael

+0

@hertsmael可能是因为'size = ...'(如果你阅读'pygame.image.fromstring'上的文档需要width + height,而不是表示图像的字符串的长度)。尝试做'pygameImage = pygame.image.fromstring(sprites.tostring(),(sprites.width,sprites.height),'RGB',False)'而不是。 – Torxed

+0

因为我不能在PngImageFile对象中找到正确的方法来获取宽度和高度,所以我最好设置它们的硬编码(只是为了使它工作)。 我得到的错误是: pygameImage = pygame.image.fromstring(sprites.tostring(),(760,166), 'RGB',假) ValueError异常:字符串长度不等于格式和分辨率大小 HTTP ://pastebin.com/QpuEwPc0 – hertsmael

相关问题