如何截取pygame屏幕的某个部分?
例如,这是我的屏幕
我想截取左上角和右下角之间区域的截图(坐标为(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))
我添加了黑色边框以显示图像边框,因为图像是白色的。
----------编辑----------
使用此函数调用
screenshot(game, "test1.png", (20, 100), (480, 400))
我得到了更好的结果 - 现在顶部和左侧都没问题,(因为左上角是x和y开始的点)但仍然 - 右侧和底侧并不好
i.imgur.com/prH2WOB.png
答案 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()