จากบทความที่แล้ว เราได้ลองเขียนคลาสที่มี constructor สำหรับอ่านและแสดงผลรูป ซึ่งได้ผลลัพธ์ดังนี้
ก่อนที่จะประมวลผลรูป น่าจะเป็นการดีที่เราแยกหน้าที่เหล่านี้ออกจากกันโดยใช้ method ใหม่แทน นั่นคือ เราจะแยกเป็น 3 method
1. constructor ทำหน้าที่รับหน้าต่างหลักมา แล้วกำหนด title ของหน้าต่าง
2. loadImage ทำหน้าที่อ่านไฟล์รูปมาเก็บไว้ในตัวแปรของคลาส
3. showImage ทำหน้าที่แสดงผลรูปในหน้าต่าง
เพื่อที่จะให้ตัวแปรใช้ร่วมกันในแต่ละ method ได้ ใน python จึงต้องสร้างให้เป็นตัวแปรของคลาส คือ มีคำว่า self นำหน้า
โค้ดที่ปรับปรุงใหม่ แต่ให้ผลลัพธ์เหมือนบทความที่แล้วก็จะเป็นดังนี้
from Tkinter import Tk, Label
from PIL import Image, ImageTk
class mainApp:
#constructor
def __init__(self,mainwindow):
#assign class variable to input parameter
self.mainwindow = mainwindow
#set title
self.mainwindow.title("Image Label")
def loadImage(self):
#load image
self.im = Image.open("lena.jpg")
def showImage(self):
#convert image to Tk format
self.imTk = ImageTk.PhotoImage(self.im)
#create a label on main window with image
lbl = Label(self.mainwindow, image=self.imTk)
#pack window to label and display
lbl.pack()
#---Main app starts here---
root = Tk()
app = mainApp(root)
#load image
app.loadImage()
#show image
app.showImage()
root.mainloop()
สังเกตว่าคราวนี้เราอ่านรูปและแสดงผลด้วย method ใหม่ ซึ่งถูกเรียกใช้งานผ่าน object
ต่อไปเราจะลองเขียน method เพื่อประมวลผลรูป เช่น เปลี่ยนรูปสี ให้เป็นรูปสีเทา
หมายเหตุ ใน PIL รูปสีปกติจะเรียกว่า RGB และรูปสีเทาจะเรียกว่า L
โค้ดของโปรแกรมก็จะเพิ่ม method ใหม่สั้นๆแค่
#----------------------------------------------
#method to convert image to grayscale
def imgGray(self):
self.im = self.im.convert("L")
self.showImage()
#----------------------------------------------
ถ้าเป็นโค้ดเต็มๆ ก็ตามนี้ครับ
from Tkinter import Tk, Label
from PIL import Image, ImageTk
class mainApp:
#constructor
def __init__(self,mainwindow):
#assign class variable to input parameter
self.mainwindow = mainwindow
#set title
self.mainwindow.title("Image Label")
def loadImage(self):
#load image
self.im = Image.open("lena.jpg")
def showImage(self):
#convert image to Tk format
self.imTk = ImageTk.PhotoImage(self.im)
#create a label on main window with image
lbl = Label(self.mainwindow, image=self.imTk)
#pack window to label and display
lbl.pack()
#method to convert image to grayscale
def imgGray(self):
self.im = self.im.convert("L")
self.showImage()
#---Main app starts here---
root = Tk()
app = mainApp(root)
#load image
app.loadImage()
#convert to grayscale image
app.imgGray()
root.mainloop()