【问题标题】:How can I crop an image with Pygame?如何使用 Pygame 裁剪图像?
【发布时间】:2011-09-08 13:07:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python image pygame crop surface


    【解决方案1】:
    cropped = pygame.Surface((80, 80))
    cropped.blit(buttonStates, (0, 0), (30, 30, 80, 80))
    

    表面上的 blit 方法将另一个表面“粘贴”到它上面。 blit 的第一个参数是源表面。第二个是粘贴到的位置(在本例中为左上角)。第三个(可选)参数是要粘贴的源图像的区域——在本例中是距离顶部 30 像素和距离左侧 30 像素的 80x80 正方形。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 也许这是一个更好的主意,但这并不能回答问题。
      【解决方案3】:

      您还可以使用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)
        traget.blit(source_surf, (posx, posy), cropped_region)
        

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-18
          • 2019-07-09
          • 2012-04-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多