#python #pygame #pygame-surface
#python #pygame #pygame-поверхность
Вопрос:
Как я могу изменить масштаб изображения, используя pygame.transform.scale
, но сохраняя то же соотношение сторон? Например, если у меня есть изображение 16: 9, и я хочу масштабировать его, сохраняя то же соотношение. Моя главная цель — создать средство просмотра изображений, потому что загрузка Windows 10 занимает целую вечность, вот мой текущий код:
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()
Я думаю, проблема в том, что я могу изменить его размер, но изображение искажается, или я могу отобразить его как ширину и высоту изображения, но я не могу масштабировать изображение настолько большим, насколько оно соответствует размерам окна, сохраняя соотношение сторон, всегда остается пустое пространство. Извините за расплывчатый вопрос, я не знаю, как это хорошо объяснить.
Редактировать: исправлено. Если у кого-то еще есть такая же проблема, мне пришлось нормализовать соотношение, получить его равным 1: что-то, разделив обе стороны на ширину. Затем я умножил соотношение 1: что-то на ширину окна и в цикле while уменьшил масштаб, если ширина изображения была больше ширины окна. Источник:
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()
Ответ №1:
Когда вы загружаете изображение, отрегулируйте окно в соответствии с соотношением сторон изображения.
В этом коде задается ширина, затем высота регулируется в соответствии с соотношением сторон изображения. Если высота слишком велика, ширина уменьшается, чтобы обеспечить меньшую высоту.
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()
Тестовый вывод
- Оригинал
- Скрипт
Комментарии:
1. Понял. Спасибо!
2. @deadflare Отметьте вопрос как принятый, если он решил вашу проблему.