如何使用Pygame裁剪图像?

时间:2011-06-04 22:28:07

标签: python image pygame crop surface

我正在学习pygame并想要一个带有三种状态的按钮的图形:正常,悬停和按下。我有一个像这样的图像...

Three button states, stacked vertically

...我希望使用其中的一部分获得新的Surface

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

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

如何仅使用该图形的一部分制作新曲面?

4 个答案:

答案 0 :(得分:29)

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

表面上的blit方法“粘贴”另一个表面。 blit的第一个参数是源表面。第二个是要粘贴的位置(在这种情况下,左上角)。第三个(可选)参数是要粘贴的源图像的区域 - 在这种情况下,从顶部开始是80x80平方30px,从左边开始是30px。

答案 1 :(得分:3)

有两种可能。

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

<块引用>

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

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

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

或者,您可以使用 subsurface 方法定义直接链接到源表面的次表面:

<块引用>

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

一旦创建了次表面,就可以随时将其用作正常表面:

cropped_region = (x, y, width, height)
cropped_subsurf = source_surf.subsurface(cropped_region)
traget.blit(cropped_subsurf, (posx, posy))

答案 2 :(得分:0)

您还可以使用pygame.Surface.subsurface方法创建与其父曲面共享像素的子表面。但是,您必须确保矩形位于图像区域内,否则将引发ValueError: subsurface rectangle outside surface area

subsurface = a_surface.subsurface((x, y, width, height))

答案 3 :(得分:-1)

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