如何在 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()
测试输出
- 原创
- 脚本
如何使用 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()
测试输出
- 原创
- 脚本