2022-02-27 17:38:23

pyqt, pyside 앱에 이미지를 넣고 싶을 때는 QLabel 위젯을 활용할 수 있다. 이때 이미지를 넣을 때 이미지의 크기를 원래 크기와 다르게 해주려면 QPixmap 클래스의 scaled 메소드를 활용해야 한다. 이미지의 크기를 지정해줄 때는 이미지의 종횡비(aspect ratio)를 어떻게 설정할 것인가를 고려해야 한다. 종횡비는 이미지의 가로세로 비율이라고 생각하면 된다. 이미지의 경우 대체로 종횡비를 유지하는 것이 실제 비율을 해치지 않기 때문에 좋다. 

 

QLabel 이미지 종횡비 설정법

 

만약 원래 이미지의 종횡비를 무시하고 지정하는 크기에 맞출 것이면 aspectMode를 Qt.IgnoreAspectRatio로 해주면 된다. 종횡비를 유지할 것이면 Qt.KeepAspectRatio로 설정하면 된다. 하지만 아래 보는 것처럼 여백이 생긴다. 그리고 Qt.KeepAspectRatioByExpanding으로 설정하면 종횡비를 유지하기 위해서 우리가 설정한 사이즈를 넘어간다. 프로그램이 의도하는 바에 따라서 적당한 flag를 선택하면 될 것이다.

 

 

 

전체 코드는 다음과 같다. 이미지가 200 x 200 의 크기로 표출되기 원하는 상황에서 종횡비 모드를 다양하게 바꿔본 것이다. 

 

from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QHBoxLayout, QWidget
from PySide6.QtGui import QPixmap
from PySide6.QtCore import QSize, Qt

import sys


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        pixmap = QPixmap("flower.jpg")
        pixmap1 = pixmap.scaled(QSize(200, 200), aspectMode=Qt.IgnoreAspectRatio)
        pixmap2 = pixmap.scaled(QSize(200, 200), aspectMode=Qt.KeepAspectRatio)
        pixmap3 = pixmap.scaled(QSize(200, 200), aspectMode=Qt.KeepAspectRatioByExpanding)

        widget1 = QLabel("IgnoreAspectRatio")
        widget2 = QLabel()
        widget2.setPixmap(pixmap1)
        widget2.setStyleSheet("border: 5px solid blue;")

        widget3 = QLabel("KeepAspectRatio")
        widget4 = QLabel()
        widget4.setPixmap(pixmap2)
        widget4.setStyleSheet("border: 5px solid blue;")

        widget5 = QLabel("KeepAspectRatioByExpanding")
        widget6 = QLabel()
        widget6.setPixmap(pixmap3)
        widget6.setStyleSheet("border: 5px solid blue;")

        layout = QHBoxLayout()
        layout.addWidget(widget1)
        layout.addWidget(widget2)
        layout.addWidget(widget3)
        layout.addWidget(widget4)
        layout.addWidget(widget5)
        layout.addWidget(widget6)

        container = QWidget()
        container.setLayout(layout)

        self.setCentralWidget(container)


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()

 

참고자료

[1] https://doc.qt.io/qtforpython-5/PySide2/QtGui/QPixmap.html