PyGame - 截取显示屏某部分的屏幕截图

时间:2016-09-17 10:01:26

标签: python python-3.x pygame

如何截取pygame屏幕的某个部分?

例如,这是我的屏幕

screen

我想截取左上角和右下角之间区域的截图(坐标为(20,100),(480,480),整个显示为500x50)。

这是我迄今为止最好的结果(但它仍然不好):

def screenshot(obj, file_name, position, size):
    img = pygame.Surface(size_f)
    img.blit(obj, (0, 0), (position, size))
    pygame.image.save(img, file_name)
...
...
...
screenshot(game, "test1.png", (0, 100), (500, 400))

screen

我添加了黑色边框以显示图像边框,因为图像是白色的。

----------编辑----------

使用此函数调用

screenshot(game, "test1.png", (20, 100), (480, 400))

我得到了更好的结果 - 现在顶部和左侧都没问题,(因为左上角是x和y开始的点)但仍然 - 右侧和底侧并不好

i.imgur.com/prH2WOB.png

1 个答案:

答案 0 :(得分:2)

您的函数有错误(size_f未定义)但是否正常。功能

def screenshot(obj, file_name, position, size):
    img = pygame.Surface(size)
    img.blit(obj, (0, 0), (position, size))
    pygame.image.save(img, file_name)

获取topleft位置和矩形的大小。你自己说过,topleft红点位于(20, 100),所以位置参数应该是(20, 100)(这就是为什么你的第二次尝试将填充修复到左边和顶部)

最低点由矩形的大小决定。我们正试图从(20, 100)转到(480, 480),所以一些快速数学会给我们这么大的数据:

width = 480 - 20 = 460
height = 480 - 100 = 380

如果您这样做,您的功能应该给出正确的结果:

screenshot(game, "test1.png", (20, 100), (460, 380))

如果您想将功能更改为两个位置,则可以执行此操作:

def screenshot(obj, file_name, topleft, bottomright):
    size = bottomright[0] - topleft[0], bottomright[1] - topleft[1]
    img = pygame.Surface(size)
    img.blit(obj, (0, 0), (topleft, size))
    pygame.image.save(img, file_name)

以下是演示两种功能的示例:

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


def screenshot(obj, file_name, position, size):
    img = pygame.Surface(size)
    img.blit(obj, (0, 0), (position, size))
    pygame.image.save(img, file_name)


def screenshot2(obj, file_name, topleft, bottomright):
    size = bottomright[0] - topleft[0], bottomright[1] - topleft[1]
    img = pygame.Surface(size)
    img.blit(obj, (0, 0), (topleft, size))
    pygame.image.save(img, file_name)

a = pygame.Surface((10, 10))
a.fill((255, 0, 0))


while 1:
    clock.tick(30)

    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_s:
                screenshot(screen, "test1.png", (20, 100), (460, 380))
                screenshot2(screen, "test2.png", (20, 100), (480, 480))
                print("PRINTED")
        elif event.type == pygame.QUIT:
            quit()

    screen.blit(a, (20, 100))
    screen.blit(a, (480, 480))
    pygame.display.update()