본문 바로가기
코딩취미/Python

PySide6에서 GIF 이미지를 반전시키는 방법

by 브링블링 2025. 2. 19.
반응형

PySide6에서 GIF 이미지를 반전시키는 방법

📝 소개

PySide6을 사용하여 GUI를 개발할 때, GIF 파일을 동적으로 처리하는 방법이 필요할 수 있습니다. 예를 들어, GIF 애니메이션의 색상을 반전(Invert)하여 표시하고 싶다면 어떻게 해야 할까요? 일반적인 정적 이미지(PNG, JPEG)는 쉽게 반전할 수 있지만, GIF는 여러 개의 프레임으로 구성된 애니메이션이므로 특별한 처리 방법이 필요합니다. 이번 포스팅에서는 PySide6에서 GIF의 각 프레임을 실시간으로 반전하는 방법을 살펴보겠습니다.

 


🎯 목표

  • PySide6에서 GIF 파일을 로드하고 애니메이션으로 표시하는 방법을 이해한다.
  • GIF의 각 프레임을 실시간으로 반전하는 방법을 배운다.
  • QMovie와 QPixmap, QImage를 활용하는 방법을 익힌다.

📌 GIF 반전 기능 구현하기

GIF의 색상을 반전하려면 다음 단계를 따라야 합니다.

  1. QMovie를 사용하여 GIF를 로드한다.
  2. QLabel을 사용하여 GIF를 화면에 표시한다.
  3. frameChanged 시그널을 이용하여 프레임이 변경될 때마다 반전된 이미지를 적용한다.
  4. invertPixels()을 사용하여 이미지 색상을 반전한다.
  5. 반전된 이미지를 QPixmap으로 변환하여 QLabel에 적용한다.

📌 예제 코드

아래는 PySide6을 사용하여 GIF 파일을 로드하고, 각 프레임을 실시간으로 반전하여 표시하는 코드입니다.

from PySide6.QtWidgets import QApplication, QLabel, QMainWindow, QVBoxLayout, QWidget
from PySide6.QtGui import QPixmap, QImage
from PySide6.QtCore import QMovie


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("GIF Inversion Example")
        self.resize(400, 400)

        # QLabel 생성 (GIF를 표시할 영역)
        self.label = QLabel(self)
        self.label.setFixedSize(300, 300)
        self.label.setScaledContents(True)

        # QMovie로 GIF 로드
        self.movie = QMovie("example.gif")  # <-- 반전할 GIF 파일 경로
        self.movie.frameChanged.connect(self.invert_frame)  # 프레임 변경 시 반전
        self.label.setMovie(self.movie)

        # GIF 재생 시작
        self.movie.start()

    def invert_frame(self):
        """현재 프레임을 가져와 색상을 반전하여 QLabel에 적용"""
        current_frame = self.movie.currentPixmap()
        if not current_frame.isNull():
            image = current_frame.toImage()
            image.invertPixels()  # 색상 반전
            inverted_pixmap = QPixmap.fromImage(image)
            self.label.setPixmap(inverted_pixmap)  # 반전된 프레임을 QLabel에 표시


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)

    window = MainWindow()
    window.show()

    sys.exit(app.exec())
반응형

📌 코드 설명

단계내용

1. QMovie 사용 GIF 파일을 QMovie("example.gif")로 로드하여 QLabel에 적용
2. frameChanged 이벤트 사용 GIF의 프레임이 변경될 때마다 invert_frame 메서드 호출
3. 현재 프레임 가져오기 self.movie.currentPixmap()을 사용하여 현재 프레임을 QPixmap으로 가져옴
4. 이미지 반전 image.invertPixels()을 호출하여 색상을 반전
5. 반전된 이미지 적용 self.label.setPixmap(inverted_pixmap)을 통해 QLabel에 반전된 이미지 표시

📌 실행 결과

GIF 파일이 정상적으로 재생되면서, 각 프레임이 실시간으로 반전됩니다.
사용자가 추가적인 조작 없이 자동으로 반전된 GIF를 볼 수 있습니다.
GIF의 색상을 반전하여 특수 효과를 적용할 수 있습니다.


📌 주의할 점

  1. GIF 저장 기능 없음
    • PySide6은 GIF를 다시 저장하는 기능을 기본적으로 제공하지 않음.
    • 반전된 GIF를 저장하려면 PIL(Pillow) 라이브러리를 사용해야 함.
  2. 성능 고려
    • 고해상도 GIF는 프레임마다 실시간 반전되므로 속도가 느려질 수 있음.
    • 최적화를 위해 GIF 크기를 줄이거나, 스레드를 사용하여 비동기 처리 가능.
반응형