我在Pygame中有一些透明背景的表面。它们的大小都一样。但是每个圆上都绘制了一个不同大小的圆圈,因此圆圈并不完全适合图像。 下面是一些示例图像(我在Photoshop中截取了截图,因此您可以清楚地看到图像的透明度和大小):
现在我想删除图像周围的透明边框,使圆圈完全适合图像。我不希望表面呈圆形,我不认为这是可能的,但我希望表面左侧和右侧没有空白列,顶部没有空白行和底部。想要的结果:
曲面上的圆圈每帧都会改变大小,因此我必须每帧重新计算新曲面。
我已经谷歌了,但我还没有找到任何关于Pygame表面的东西。我也尝试制作自己的功能,但它看起来很丑陋而且更糟糕:帧速率从50(如果我不调用函数)下降到30 fps(如果我调用该函数)。我测试了一下,我发现较小的圆圈比较大的圆圈需要更长的时间来处理。我怎么能这样做,但速度更快。如果你愿意,我可以展示我所做的功能。
答案 0 :(得分:5)
表面对象有一个名为get_bounding_rect
的方法,我们将从这里开始。该函数返回包含曲面上所有非透明像素的最小rect。
pixel_rect = image.get_bounding_rect()
使用此rect的大小,我们可以创建一个新表面:
trimmed_surface = pygame.Surface(pixel_rect.size)
现在将image
中包含的pixel_rect
部分点击到trimmed_surface
上:
trimmed_surface.blit(image, (0,0), pixel_rect)
此时,trimmed_surface
应该是与pixel_rect
大小相同的表面,不需要的透明行和列会从原始曲面“修剪”。
Surface.get_bounding_rect的文档:http://www.pygame.org/docs/ref/surface.html#Surface.get_bounding_rect