본문으로 바로가기
반응형

PyQt5 에는 미디어 파일을 다루는 클래스가 별도로 있습니다. QtGui 패키지에 포함되어 있습니다. 이미지관련클래스는 QImage, QPixmap, QBitmap, QPicture 가 있습니다. 이미지를 읽거나 픽셀을 조작하고 싶다면 QImage 사용합니다. 그리고 화면에 이미지를 표현할 때는 QPixmap 을 이용합니다.

 

1. 화면에 이미지 표시하기

 

화면에 이미지를 표시하기 위해서는 QPixmap QLabel 이 필요합니다. QPixmap 은 이미지를 다루는 클래스이며, QLabel 객체를 이용해서 화면에 표시합니다. 먼저 QtGui 모듈에 있는 QPixmap 클래스를 추가하고 객체를 생성합니다. 생성자 파라미터로 이미지 Path 를 넘깁니다.

from PyQt5.QtGui import QPixmap

# QPixmap 객체
self.pixmap = QPixmap('images/bg.jpg')

 

다음은 QLabel 객체를 생성하고 setPixmap() 함수를 이용해서 QPixmap 객체를 추가합니다. 화면에는 QPixmap 이 가져온 이미지를 QLabel 에 표시합니다. QMainWindow 화면과 이미지를 표시할 QLabel 화면의 구분을 위해 margin 을 줘서 공간을 띄웠습니다. 사용한 함수는 setContentsMargins() 입니다. 그리고 QLabel QPixmap 이 불러온 이미지 크기만큼 윈도우의 크기를 재설정합니다. resize() 함수의 파라미터로 이미지의 가로/세로 크기를 입력합니다.

from PyQt5.QtWidgets import QLabel

# 이미지를 추가할 라벨
self.label = QLabel(self)
self.label.setPixmap(self.pixmap) # 이미지 세팅
self.label.setContentsMargins(10, 10, 10, 10)
self.label.resize(self.pixmap.width(), self.pixmap.height())

 

2. QFileDialog 이용해서 원하는 이미지 표시하기

 

이번에는 파일 다이얼로그(QFileDialog) 를 이용해서 사용자가 선택한 이미지를 화면에 표시해 보겠습니다. 추가할 위젯은 QPushButton QFileDialog 입니다. QFileDialog 객체를 생성하고 getOpenFileName() 함수를 이용해서 사용자가 선택한 파일의 정보를 반환받습니다.

from PyQt5.QtWidgets import QFileDialog

fname = QFileDialog.getOpenFileName(self, 'Open File', '',
                                    'All File(*);; Image File(*.png *.jpg)')

 

위에서 QFileDialog 로 사용자가 선택한 파일의 정보를 반환 받아 fname 변수에 저장했습니다. fname object type 은 튜플(tuple) 입니다. 튜플은 순서가 있는 객체의 집합입니다. 그래서 인덱스로 접근이 가능합니다. 첫 번째 인덱스에는 파일 경로가 담겨져 있는데, if 로 값이 없으면 파일을 선택하지 않았습니다. “ 라는 메시지를 띄웁니다.

 

QFileDialog 로 사용자가 선택한 이미지 파일의 경로를 알아낸 뒤 QPixmap 의 생성자 함수 파라미터로 넘겨서 객체를 생성합니다. QLabel 객체에 이미지를 띄우기 위해 setPixmap() 함수를 이용해서 QPixmap 객체를 추가합니다.

if fname[0]:
    # QPixmap 객체
    pixmap = QPixmap(fname[0])

    self.label.setPixmap(pixmap)  # 이미지 세팅
    self.label.setContentsMargins(10, 30, 10, 10)
    self.label.resize(pixmap.width(), pixmap.height())

    # 이미지의 크기에 맞게 Resize
    self.resize(pixmap.width(), pixmap.height())

else:
    QMessageBox.about(self, 'Warning', '파일을 선택하지 않았습니다.')

 

수정한 전체 소스는 다음과 같습니다.

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QMainWindow, QLabel, QPushButton, \
    QApplication, QFileDialog, QMessageBox
from PyQt5.QtGui import QPixmap

'''
버튼을 클릭해서 화면에 이미지를 추가한다. 파일 경로도 표현한다.    
'''
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 윈도우 설정
        self.setGeometry(300, 300, 400, 300)  # x, y, w, h
        self.setWindowTitle('Status Window')

        # QButton 위젯 생성 - FileDialog 을 띄위기 위한 버튼
        self.button = QPushButton('QFileDialog Open', self)
        self.button.clicked.connect(self.filedialog_open)
        self.button.setGeometry(10, 10, 200, 30)

        # 이미지를 추가할 라벨
        self.label = QLabel(self)

    def filedialog_open(self):
        fname = QFileDialog.getOpenFileName(self, 'Open File', '',
                                            'All File(*);; Image File(*.png *.jpg)')

        if fname[0]:
            # QPixmap 객체
            pixmap = QPixmap(fname[0])

            self.label.setPixmap(pixmap)  # 이미지 세팅
            self.label.setContentsMargins(10, 50, 10, 10)
            self.label.resize(pixmap.width(), pixmap.height())

            # 이미지의 크기에 맞게 Resize
            self.resize(pixmap.width(), pixmap.height())

        else:
            QMessageBox.about(self, 'Warning', '파일을 선택하지 않았습니다.')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

반응형