如何将pygame的Surface转换为PIL图像?

9

我正在使用PIL来透视转换屏幕的一部分。

原始图像数据是一个pygame Surface,需要将其转换为PIL Image。

因此,我找到了pygame的tostring函数,用于此目的。

然而,结果看起来非常奇怪(请参见附加的截屏)。这段代码出了什么问题:

rImage = pygame.Surface((1024,768))

#draw something to the Surface
sprite = pygame.sprite.RenderPlain((playboard,))
sprite.draw(rImage)

pil_string_image = pygame.image.tostring(rImage, "RGBA",False)
pil_image = Image.fromstring("RGBA",(660,660),pil_string_image)

我做错了什么?

pygame表面转换为PIL图像


1
如果你把(1024,768)替换成(660,660),或者反过来,会是什么样子呢? - James Waldby - jwpat7
Pygame的文档中关于pygame.image.fromstring(string, size, format, flipped=False)的说明是:“图像的大小和格式必须与传递的字符串缓冲区完全相同。否则将引发异常”,但除此之外我不知道它是如何工作的。 - James Waldby - jwpat7
请将以下与编程有关的内容从英语翻译成中文。仅返回已翻译的文本: - Hedge
1个回答

8
正如我在评论中提到的,pygame文档中对于pygame.image.fromstring(string, size, format, flipped=False)的说明是:“大小和格式图像必须与传递的字符串缓冲区计算出完全相同的大小。否则将引发异常。”因此,在两个调用中使用(1024,768)代替(660,660),或反之亦然 - 通常情况下,这两个调用的尺寸应该是相同的,这更有可能起作用。(我说“更有可能起作用”而不是“可行”,因为我没有测试过任何情况。)
怀疑出现问题的原因是:部分图像的奇怪外观类似于显示屏设置为它无法同步的光栅率; 即,图像行的起始位置不在左边缘,而是在其他位置;在这种情况下,是由于图像行长度大于显示行长度所造成的。我假设雪花是精灵,与扭曲的图像单独生成。

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