如何在Pygame中将图像缩放到屏幕大小

Ilm*_*ont 25 python scaling pygame background image

我想知道如何将pygame项目中图像的大小缩放到屏幕的分辨率.例如,设想以下场景假设当前窗口显示模式; 我假设全屏将是相同的:

  • 我有一个1600x900背景图像,当然在1600x900窗口中本地显示

  • 在一个1280x720窗口中,我显然可以将这个图像缩放到1280x720

  • 然而,如果我需要添加,请说一个尺寸适合原始背景的300x300 px图像x,y 1440,860(示例尺寸)会发生什么1600x900?当然,对于1600x900我当然可以原生使用图像,但是较小/较大的窗口大小呢?

基本上,如何将图像缩放到窗口大小然后相应地定位?我想必须有一个非常简单的自动化方法,但现在我无法弄清楚,坦率地说没有时间去搜索它...

提前谢谢,Ilmiont

unu*_*tbu 56

您可以使用以下方式缩放图像pygame.transform.scale:

import pygame
picture = pygame.image.load(filename)
picture = pygame.transform.scale(picture, (1280, 720))
Run Code Online (Sandbox Code Playgroud)

然后,您可以获取picturewith 的边界矩形

rect = picture.get_rect()
Run Code Online (Sandbox Code Playgroud)

用图片移动图片

rect = rect.move((x, y))
screen.blit(picture, rect)
Run Code Online (Sandbox Code Playgroud)

在哪里screen设置类似的东西

screen = pygame.display.set_mode((1600, 900))
Run Code Online (Sandbox Code Playgroud)

要允许小部件调整为各种屏幕大小,可以使显示大小调整:

import os
import pygame
from 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()
Run Code Online (Sandbox Code Playgroud)


fur*_*ras 6

如果您将1600x900缩放到1280x720,则可以

scale_x = 1280.0/1600
scale_y = 720.0/900
Run Code Online (Sandbox Code Playgroud)

您可以使用它来查找按钮大小和按钮位置

button_width  = 300 * scale_x
button_height = 300 * scale_y

button_x = 1440 * scale_x
button_y = 860  * scale_y
Run Code Online (Sandbox Code Playgroud)

如果您将1280x720扩展到1600x900,则可以

scale_x = 1600.0/1280
scale_y = 900.0/720
Run Code Online (Sandbox Code Playgroud)

和休息是一样的.


我将.0值添加到float- 否则scale_x,scale_y将舍入到integer- 在此示例中为0(零)(Python 2.x)

  • 有什么理由不使用 pygame.transform.scale 吗? (3认同)