如何使用Pygame裁剪图像?

25

我正在学习pygame,想为按钮设计三种状态:正常、悬停和按下。我有一张像这样的图片...

Three button states, stacked vertically

...我想使用其中的一部分来获取一个新的Surface

我正在使用以下代码加载图像:

 buttonStates = pygame.image.load(os.path.join('image','button.png'))

我怎样才能使用图形的一部分来创建一个新的表面?

4个回答

45
cropped = pygame.Surface((80, 80))
cropped.blit(buttonStates, (0, 0), (30, 30, 80, 80))

Surface的blit方法可以将另一个Surface“粘贴”到其上。 blit的第一个参数是源Surface,第二个参数是要粘贴到的位置(在本例中为左上角)。第三个(可选)参数是要从中粘贴源图像的区域--在这种情况下是从左上角起30px处开始的80x80正方形。


8
你也可以使用pygame.Surface.subsurface方法创建与父表面共享像素的子表面。但是,你必须确保矩形在图像区域内,否则会引发ValueError: subsurface rectangle outside surface area错误。
subsurface = a_surface.subsurface((x, y, width, height))

4

有两种可能性。

blit 方法允许指定源_Surface的矩形子区域:

[...] 还可以传递一个可选的区域矩形。这表示要绘制的源 Surface 的较小部分。[...]

通过这种方式,您可以直接将源表面的区域 blit 到目标表面上:

cropped_region = (x, y, width, height)
target.blit(source_surf, (posx, posy), cropped_region)

或者,您可以使用subsurface方法定义一个与源表面直接链接的子表面:

返回与其新父级共享像素的新表面。新表面被认为是原始表面的子代。对任一表面像素的修改都会互相影响。

一旦创建了子表面,它随时可以像普通表面一样使用:

cropped_region = (x, y, width, height)
cropped_subsurf = source_surf.subsurface(cropped_region)

target.blit(cropped_subsurf, (posx, posy))

-1

我认为最好的方法是在外部程序中裁剪这3种按钮的图像,并加载到不同的表面,而不是使用pygame来裁剪它


5
也许那是一个更好的想法,但这并没有回答问题。 - krypticbit

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