如何用Pygame裁剪图片?

25 投票
4 回答
29410 浏览
提问于 2025-04-16 18:57

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

三个按钮状态,垂直堆叠

...我想从中提取一部分来创建一个新的 Surface

我用以下代码加载这张图片:

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

我该怎么做才能仅使用这张图的一部分来创建一个新的表面呢?

4 个回答

4

这里有两种可能性。

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))
8

你还可以使用 pygame.Surface.subsurface 这个方法来创建子表面,这些子表面会和它们的父表面共享像素。不过,你需要确保这个矩形区域是在图像的范围内,否则就会出现 ValueError: subsurface rectangle outside surface area 的错误。

subsurface = a_surface.subsurface((x, y, width, height))
46
cropped = pygame.Surface((80, 80))
cropped.blit(buttonStates, (0, 0), (30, 30, 80, 80))

在一个表面上,blit方法可以把另一个表面“粘贴”上去。blit的第一个参数是要粘贴的源表面。第二个参数是粘贴的位置(在这个例子中,是左上角)。第三个参数是可选的,它指定了要从源图像中粘贴的区域——在这个例子里,是一个80x80的正方形,距离顶部30像素,距离左边30像素。

撰写回答