顯示 Pillow 圖片
這篇教學會介紹如何運用 PyQt5 的 QLabel 搭配 QPixmap,在 PyQt5 中顯示 Pillow 函式庫所開啟的圖片,如果可以顯示 Pillow 開啟的圖片,就能進一步實現調整圖片亮度對比的功能,實作出簡單的影像調整軟體囉。
快速導覽:
- PyQt6 版本參考:PyQt6 教學 - 顯示 Pillow 圖片
- 因為 Google Colab 不支援 PyQt5,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。
安裝 Pillow
輸入下列指令安裝 Pillow,根據個人環境使用 pip 或 pip3,如果使用 Anaconda Jupyter,已經內建 Pillow 函式庫。
pip install Pillow
顯示 Pillow 圖片
載入對應的函式庫時,額外載入 PIL 的 ImageQt 模組,這個模組可以將 Pillow 所讀取的圖片檔案,轉換成可以在 QPixmap 中顯示的格式,讀取之後就能利用「使用 QLabel + QPixmap」方法顯示圖片。
from PyQt5 import QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
from PIL import Image, ImageQt
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
MainWindow.setObjectName("MainWindow")
MainWindow.setWindowTitle("oxxo.studio")
MainWindow.resize(300, 300)
img = Image.open('mona.jpg') # 使用 Pillow 開啟圖片
qimg = ImageQt.toqimage(img) # 轉換成 QPixmap 格式
canvas = QPixmap(300,300).fromImage(qimg) # 建立 QPixmap 畫布,讀取圖片
label = QtWidgets.QLabel(MainWindow) # 建立 QLabel
label.setGeometry(0, 0, 300, 300) # 設定 QLabel 尺寸位置
label.setPixmap(canvas) # QLabel 放入畫布
MainWindow.show()
sys.exit(app.exec_())
也可以改用 class 的寫法:
from PyQt5 import QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
from PIL import Image, ImageQt
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 300)
self.setUpdatesEnabled(True)
self.ui()
def ui(self):
img = Image.open('mona.jpg')
qimg = ImageQt.toqimage(img)
self.canvas = QPixmap(300,300).fromImage(qimg)
self.label = QtWidgets.QLabel(self)
self.label.setGeometry(0, 0, 300, 300)
self.label.setPixmap(self.canvas)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec_())
顯示 Pillow 調整後的圖片
因為已經是透過 Pillow 載入圖片,所以就能善用 Pillow 影像處理的功能,例如參考「調整圖片亮度、對比、飽和度和銳利度」教學範例,額外載入 Pillow 的 ImageEnhance 模組,就能在 PyQt5 的視窗介面中,呈現使用 Pillow 調整後的圖片。
from PyQt5 import QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
from PIL import Image, ImageQt, ImageEnhance
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
MainWindow.setObjectName("MainWindow")
MainWindow.setWindowTitle("oxxo.studio")
MainWindow.resize(300, 300)
img = Image.open('mona.jpg')
img = ImageEnhance.Brightness(img).enhance(5) # 提高亮度
img = ImageEnhance.Contrast(img).enhance(5) # 提高對比
qimg = ImageQt.toqimage(img)
canvas = QPixmap(300,300).fromImage(qimg)
label = QtWidgets.QLabel(MainWindow)
label.setGeometry(0, 0, 300, 300)
label.setPixmap(canvas)
MainWindow.show()
sys.exit(app.exec_())
也可以改用 class 的寫法:
from PyQt5 import QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
from PIL import Image, ImageQt, ImageEnhance
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 300)
self.setUpdatesEnabled(True)
self.ui()
def ui(self):
img = Image.open('mona.jpg')
img = ImageEnhance.Brightness(img).enhance(5) # 提高亮度
img = ImageEnhance.Contrast(img).enhance(5) # 提高對比
qimg = ImageQt.toqimage(img)
self.canvas = QPixmap(300,300).fromImage(qimg)
self.label = QtWidgets.QLabel(self)
self.label.setGeometry(0, 0, 300, 300)
self.label.setPixmap(self.canvas)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec_())
延伸應用
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~