How to scale images to screen size in Pygame How to scale images to screen size in Pygame python python

How to scale images to screen size in Pygame


You can scale the image with pygame.transform.scale:

import pygamepicture = pygame.image.load(filename)picture = pygame.transform.scale(picture, (1280, 720))

You can then get the bounding rectangle of picture with

rect = picture.get_rect()

and move the picture with

rect = rect.move((x, y))screen.blit(picture, rect)

where screen was set with something like

screen = pygame.display.set_mode((1600, 900))

To allow your widgets to adjust to various screen sizes,you could make the displayresizable:

import osimport pygamefrom pygame.locals import *pygame.init()screen = pygame.display.set_mode((500, 500), HWSURFACE | DOUBLEBUF | RESIZABLE)pic = pygame.image.load("image.png")screen.blit(pygame.transform.scale(pic, (500, 500)), (0, 0))pygame.display.flip()while True:    pygame.event.pump()    event = pygame.event.wait()    if event.type == QUIT:        pygame.display.quit()    elif event.type == VIDEORESIZE:        screen = pygame.display.set_mode(            event.dict['size'], HWSURFACE | DOUBLEBUF | RESIZABLE)        screen.blit(pygame.transform.scale(pic, event.dict['size']), (0, 0))        pygame.display.flip()


If you scale 1600x900 to 1280x720 you have

scale_x = 1280.0/1600scale_y = 720.0/900

Then you can use it to find button size, and button position

button_width  = 300 * scale_xbutton_height = 300 * scale_ybutton_x = 1440 * scale_xbutton_y = 860  * scale_y

If you scale 1280x720 to 1600x900 you have

scale_x = 1600.0/1280scale_y = 900.0/720

and rest is the same.


I add .0 to value to make float - otherwise scale_x, scale_y will be rounded to integer - in this example to 0 (zero) (Python 2.x)


i do not know if you meant this, but this is how to scale to the size of the screen an image at the max that is possible, without losing the aspect ratio of the image among width and height

row = pygame.image.load(f"{image}")x, y = row.get_size()rx = 1000 / xry = 600 / yprint(rx)print(ry)ratio = rx if rx < ry else ryrow = pygame.transform.scale(row, (int(x*rx), int(y*rx)))