Serial
Serial

Reputation: 8043

How to take screenshot of certain part of screen in Pygame

Is there a way I can take a screenshot of the right half of my pygame window?

I'm making a game using pygame and I need to take a snapshot of the screen but not the whole screen, just the right half.

I know of:

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

But that will include the entire screen in the image.

Is there a way I can take a screenshot of the right half of my pygame window?

Maybe by changing the area that it includes somehow? I've googled it but couldn't find anything I was thinking maybe I could use PIL to crop it, but that seems like a lot of additional work.

If it's not possible, can anyone tell me the easiest way for me to crop the picture of the whole screen?

Upvotes: 12

Views: 18849

Answers (4)

PythonProgrammi
PythonProgrammi

Reputation: 23463

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()

Upvotes: 0

Mr Ed
Mr Ed

Reputation: 5136

This didn't exactly work on my system with Python 3.7.4. Here is a version which worked:

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")

Upvotes: 0

Guest1286
Guest1286

Reputation: 1

I would do something like:

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

Then later on when you want to take the screenshot do:

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

Upvotes: -2

Haz
Haz

Reputation: 2679

If you always want the screenshot to be of the same portion of the screen, you could use the subsurface. http://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")

The subsurface would work well in this scenario because any changes to the parent surface (screen in this case) will be applied to the subsurface as well.

If you want to be able to specify an arbitrary portion of the screen to take a screenshot of (so, not the same rectangle every time) then it would probably be better to create a new surface, blit the desired portion of the screen to that surface, and then save it.

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

Upvotes: 18

Related Questions