如何在Pygame中截取屏幕的某些部分

时间:2013-06-24 02:52:41

标签: python pygame screenshot crop

有没有办法可以截取我的pygame窗口的右半部分?

我正在使用pygame制作游戏,我需要拍摄屏幕的快照,而不是整个屏幕,只是右半部分。

我知道:

pygame.image.save(screen,"screenshot.jpg")

但这将包括图像中的整个屏幕。

有没有办法可以截取我的pygame窗口的右半部分?

也许通过某种方式更改它包含的区域?我用Google搜索了但是找不到任何我想的东西也许我可以使用PIL裁剪它,但这似乎是很多额外的工作。

如果不可能,有人能告诉我最容易裁剪整个画面的方法吗?

4 个答案:

答案 0 :(得分:10)

如果您始终希望屏幕截图与屏幕的位置相同,则可以使用subsurfacehttp://www.pygame.org/docs/ref/surface.html#pygame.Surface.subsurface

rect = pygame.Rect(25, 25, 100, 50)
sub = screen.subsurface(rect)
pygame.image.save(sub, "screenshot.jpg")

subsurface在这种情况下效果很好,因为父表面的任何更改(本例中为screen)也会应用于地下。

如果你想能够指定屏幕的任意部分来截取屏幕(因此,每次都不是相同的矩形),那么创建一个新的表面可能会更好,然后将所需的部分插入屏幕到那个表面,然后保存。

rect = pygame.Rect(25, 25, 100, 50)
screenshot = pygame.Surface(100, 50)
screenshot.blit(screen, area=rect)
pygame.image.save(screenshot, "screenshot.jpg")

答案 1 :(得分:0)

这在使用Python 3.7.4的系统上不完全有效。这是一个可行的版本:

rect = pygame.Rect(25, 25, 100, 50)
sub = screen.subsurface(rect)
screenshot = pygame.Surface((100, 50))
screenshot.blit(sub, (0,0))
pygame.image.save(screenshot, "screenshot.jpg")

答案 2 :(得分:0)

import pygame
import sys


screen = pygame.display.set_mode((400, 500))
clock = pygame.time.Clock()


def grab(x, y, w, h):
    "Grab a part of the screen"
    # get the dimension of the surface
    rect = pygame.Rect(x, y, w, h)
    # copy the part of the screen
    sub = screen.subsurface(rect)
    # create another surface with dimensions
    # This is done to unlock the screen surface
    screenshot = pygame.Surface((w, h))
    screenshot.blit(sub, (0, 0))
    return screenshot


def blit(part, x, y):
    screen.blit(part, (x, y))


def quit():
    pygame.quit()
    sys.exit()


def start():
    # shows half the screen
    blit(back, 0, 0)
    # and the other half copied
    sub = grab(50, 0, 75, 250)
    blit(sub, 200, 0)
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    quit()
        pygame.display.update()
        clock.tick(60)


back = pygame.image.load("img\\back.png")

start()

答案 3 :(得分:-1)

我会做类似的事情:

example = pygame.Surface(screen.get_width()/2, 0)

然后稍后当你想拍摄截图时:

pygame.image.save(example, "example.jpg")