Qt/PyQt5 강좌

PyQT5 - 랜덤 컬러 그리드 생성하기

webnautes 2024. 4. 17. 21:22
반응형

PyQt5를 사용하여 격자에 랜덤으로 컬러 그리드를 생성한 예제입니다. 

 

2024. 4. 17 최초작성

 

 

 

 

 

import sys
import numpy as np
from PyQt5.QtWidgets import QApplication, QDialog, QLabel, QVBoxLayout
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtCore import QThread, pyqtSignal
import matplotlib


class Thread(QThread):
    updated = pyqtSignal(np.ndarray)

    def run(self):
        while True:
            original_array = np.random.randint(0, 256, (5, 5))
            self.updated.emit(original_array)
            QThread.sleep(1)


class ImageDialog(QDialog):
    def __init__(self):
        super().__init__()
        self.initUI()
       
        self.update_thread = Thread()
        self.update_thread.updated.connect(self.updateImage)
        self.update_thread.start()

    def initUI(self):
        self.setWindowTitle('inferno')
        self.label = QLabel(self)
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.label)
        self.setLayout(self.layout)

    def updateImage(self, original_array):

        # 'plasma' 컬러맵을 사용하여 각 값에 대응하는 RGB 색상 계산. 0 ~ 1 사이 값으로 구성
        cmap = matplotlib.colormaps['plasma']

        # RGB 색상 선택. original_array는 0~255 사이값이고 cmap을 선택
        rgb_colors = cmap(original_array)[:,:,:3]

        # RGB 색상을 갖는 확대된 배열 생성
        scaled_rgb_array = np.kron(rgb_colors, np.ones((100, 100, 1)))

        # 0~255 사이 값으로 변환하고 데이터 타입을 uint8로 변환
        scaled_rgb_array = (scaled_rgb_array * 255).astype(np.uint8)

        height, width, _ = scaled_rgb_array.shape 

        # 한 줄 당 바이트 수는 너비 * 채널 수
        bytes_per_line = 3 * width
        q_image = QImage(scaled_rgb_array.data, width, height, bytes_per_line, QImage.Format_RGB888)

       
        pixmap = QPixmap.fromImage(q_image)
        self.label.setPixmap(pixmap)

app = QApplication(sys.argv)
dialog = ImageDialog()
dialog.show()
sys.exit(app.exec_())



반응형