删除Pygame中图像周围的边框

use*_*752 3 python performance pygame border

我在Pygame中有一些透明背景的表面.它们的大小都一样.但是每个圆上都绘制了一个不同大小的圆圈,因此圆圈并不完全适合图像.下面是一些示例图像(我在Photoshop中截取了截图,因此您可以清楚地看到图像的透明度和大小):

在此输入图像描述 在此输入图像描述 在此输入图像描述

现在我想删除图像周围的透明边框,使圆圈完全适合图像.我不希望表面呈圆形,我不认为这是可能的,但我希望表面左侧和右侧没有空白列,顶部没有空白行和底部.想要的结果:

在此输入图像描述 在此输入图像描述 在此输入图像描述

曲面上的圆每帧都会改变大小,因此我必须每帧重新计算新曲面.

我已经谷歌了,但我还没有找到任何关于Pygame表面的东西.我也尝试制作自己的功能,但它看起来很丑陋而且更糟糕:帧率从50(如果我不调用函数)下降到30 fps(如果我调用该函数).我测试了一下,我发现较小的圆圈比较大的圆圈需要更长的处理时间.我怎么能这样做,但速度更快.如果你想我可以展示我所做的功能.

Haz*_*Haz 5

surface对象有一个方法get_bounding_rect,我们将在这里开始.该函数返回可能的最小rect,其中包含曲面上的所有非透明像素.

pixel_rect = image.get_bounding_rect()
Run Code Online (Sandbox Code Playgroud)

使用此rect的大小,我们可以创建一个新表面:

trimmed_surface = pygame.Surface(pixel_rect.size)
Run Code Online (Sandbox Code Playgroud)

现在的blit的所述部分image包含在pixel_recttrimmed_surface:

trimmed_surface.blit(image, (0,0), pixel_rect)
Run Code Online (Sandbox Code Playgroud)

此时,trimmed_surface应该是pixel_rect与原始表面不同的透明行和列"修剪" 的表面尺寸相同的表面.

Surface.get_bounding_rect的文档:http://www.pygame.org/docs/ref/surface.html#Surface.get_bounding_rect