Monday, November 26, 2012

การประมวลผลรูปและแสดงผลในหน้าต่าง

จากบทความที่แล้ว เราได้ลองเขียนคลาสที่มี 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()

No comments:

Post a Comment