如何在 Pygame 中保持宽高比的同时缩放图像?

How to scale image while keeping aspect ratio in Pygame?

如何使用 pygame.transform.scale 重新缩放图像但保持相同的纵横比?就像我有一个 16:9 图像并且我想在保持相同比例的同时缩放它。我的主要目标是制作一个图像查看器,因为 Windows 10's 需要永远加载,这是我当前的代码:

import pygame
from sys import argv
from win32api import GetSystemMetrics
pygame.init()
pygame.display.init()

width=GetSystemMetrics(0)*0.9   #Window size a bit smaller than monoitor size
height=GetSystemMetrics(1)*0.8
img=pygame.image.load(argv[-1]) #Get image file opened with it

img=pygame.transform.scale(img, (int(width), int(height)))  #Scales image to window size
Main=pygame.display.set_mode((int(width), int(height)))
pygame.display.set_caption(str(argv[-1].split("\")[-1]))   #Set window title as filename
imgrect=img.get_rect()

Main.blit(img, imgrect)
pygame.display.update()
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            exit()

我想问题是我可以调整它的大小但是图像失真了,或者我可以将它显示为图像的宽度和高度,但是我无法将图像缩放到它在 window的尺寸同时保持纵横比,总是有空白space。不好意思问的含糊不清,不知道怎么解释好。

编辑:修复了它。如果其他人遇到同样的问题,我必须将比率归一化,通过将两边除以宽度使其达到 1:something。然后,我将 1:something 比率乘以 window 的宽度,并在 while 循环中,如果图像的宽度大于 window 的宽度,则减小比例。来源:

import pygame
from sys import argv
from win32api import GetSystemMetrics
pygame.init()
pygame.display.init()

windowwidth=GetSystemMetrics(0)*0.9
windowheight=GetSystemMetrics(1)*0.8
Main=pygame.display.set_mode((int(windowwidth), int(windowheight)))
img=pygame.image.load(argv[-1])

imgratiox=int(1)
imgratioy=int(img.get_height()/img.get_width())

imgwindowwidth=int(windowwidth)
imgwindowheight=int(round(img.get_height()/img.get_width(), 2)*windowwidth)
scale=1
while imgwindowheight>windowheight:
    imgwindowheight*=scale
    imgwindowwidth*=scale
    scale-=0.05

img=pygame.transform.scale(img, (int(imgwindowwidth), int(imgwindowheight)))
pygame.display.set_caption(str(argv[-1].split("\")[-1])+ "    Img width:"+str(img.get_width())+"    Img height:"+str(img.get_height()))
imgrect=img.get_rect()

Main.blit(img, imgrect)
pygame.display.update()
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            exit()

加载图像时,调整 window 以匹配图像比例。

在这段代码中,设置了宽度,然后根据图像比例调整了高度。如果高度太大,宽度会减小以允许更小的高度。

import pygame
from sys import argv
from win32api import GetSystemMetrics
pygame.init()
pygame.display.init()

img=pygame.image.load(argv[-1]) #Get image file opened with it

width=GetSystemMetrics(0)*0.9   #Window size a bit smaller than monoitor size
height=width*img.get_height()/img.get_width()  # keep ratio

if height > GetSystemMetrics(1)*0.8:  # too tall for screen
    width = width * (GetSystemMetrics(1)*0.8)/height  # reduce width to keep ratio 
    height = GetSystemMetrics(1)*0.8  # max height

img=pygame.transform.scale(img, (int(width), int(height)))  #Scales image to window size
Main=pygame.display.set_mode((int(width), int(height)))
pygame.display.set_caption(str(argv[-1].split("\")[-1]))   #Set window title as filename
imgrect=img.get_rect()

Main.blit(img, imgrect)
pygame.display.update()
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            exit()

测试输出

  • 原创

  • 脚本