如何用Pygame裁剪图片?
我正在学习 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像素。