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

Posted

技术标签:

【中文标题】如何将 pygame Surface 转换为 PIL 图像?【英文标题】:How to convert a pygame Surface to a PIL Image? 【发布时间】:2012-12-20 01:05:22 【问题描述】:

我正在使用 PIL 对屏幕的一部分进行透视变换。 原始图像数据是一个 pygame Surface,需要转换为 PIL 图像。

因此我找到了为此目的而存在的 pygame 的 tostring-function。

但是结果看起来很奇怪(见附件截图)。这段代码出了什么问题:

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)

我做错了什么?

【问题讨论】:

如果用 (1024,768) 代替 (660,660) 会是什么样子,反之亦然? pygame docs about pygame.image.fromstring(string, size, format, flipped=False) 说“大小和格式图像必须计算与传递的字符串缓冲区完全相同的大小。否则会引发异常”,但除此之外我不知道它是如何工作的。 请添加您的猜测作为答案,以便我将问题标记为已解决! 【参考方案1】:

正如我在评论中指出的,pygame documentation pygame.image.fromstring(string, size, format, flipped=False) 表示“大小和格式图像必须计算与传递的字符串缓冲区完全相同的大小。否则将引发异常”。因此,使用 (1024,768) 代替 (660,660),反之亦然——通常,两个调用的维度相同——更有可能起作用。 (我说“更有可能奏效”而不是“会奏效”,因为我没有测试任何案例。)

怀疑此类问题的原因:图像的一部分看起来很奇怪,就像一个设置为无法同步的光栅速率的显示屏;即,图像的线条从左边距以外的点开始显示;在这种情况下,因为图像行长度比显示行长度长。我假设雪花是精灵,与扭曲的图像分开生成。

【讨论】:

以上是关于如何将 pygame Surface 转换为 PIL 图像?的主要内容,如果未能解决你的问题,请参考以下文章

pygame.surface.blit()方法4个参数的使用方法

pygame:屏蔽非图像类型的表面

如何使用 buildozer 将可以显示图像的 pygame 转换为 apk

pygame定义不同的位置顺序以得到不同的结果

将 Pygame 3.5 转换为可执行文件 - Mac

python游戏库pygame经典教程