Как масштабировать изображение, сохраняя соотношение сторон в Pygame?

#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()
  

Тестовый вывод

  • Оригинал

Оригинал

  • Скрипт

Pygame

Комментарии:

1. Понял. Спасибо!

2. @deadflare Отметьте вопрос как принятый, если он решил вашу проблему.