Friday, November 30, 2012

เมนูบันทึกไฟล์รูป

เราลองมาเพิ่มเมนูสำหรับการบันทึกไฟล์รูปหลังจากประมวลผลกันครับ



หลักการก็คือต้องสร้างเมนู Save as... จากนั้นก็เพิ่มโค้ดในส่วนของการบันทึกรูป โค้ดทั้งหมดก็จะเป็นตามนี้ครับ

from Tkinter import Tk,Menu,Label
from PIL import Image,ImageTk
import tkFileDialog

class MainApp:
    #constructor
    def __init__(self,mainwindow):
        #assign class variable to input parameter
        self.mainwindow = mainwindow
        #set title
        self.mainwindow.title("Menu")
        self.lbl = Label(self.mainwindow)

    def createMenu(self):
        #create menubar
        menubar = Menu(self.mainwindow)
        self.mainwindow.config(menu=menubar)
        #FILE menu
        fileMenu = Menu(menubar, tearoff=0)
        menubar.add_cascade(label="File", menu=fileMenu)
        fileMenu.add_command(label="Open...",command=self.openFile)
        fileMenu.add_command(label="Save as...",command=self.saveFile)
        fileMenu.add_separator()
        fileMenu.add_command(label="Exit", command=self.mainwindow.destroy)
        #EDIT menu
        editMenu = Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Edit", menu=editMenu)
        editMenu.add_command(label="Restore Image", command=self.imgRestore)
        #PROCESS menu
        processMenu = Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Process", menu=processMenu)
        processMenu.add_command(label="Rotate", command=self.imgRotate)

    def openFile(self):
        #file type filter
        ftypes = [('Image files', '*.jpg *.png *.gif'),
        ('All files', '*')]
        filename = tkFileDialog.askopenfilename(parent=self.mainwindow,title='Choose a file',filetypes=ftypes)
        if filename:
           try:
                #open image
                self.im = Image.open(filename)
                #keep its copy for restoring later
                self.imOrigin = self.im.copy()
                self.showImage()
           except: pass

    def saveFile(self):
        ftypes = [('JPEG', '*.jpg')]
        filename = tkFileDialog.asksaveasfilename(parent=self.mainwindow,title='Save image as',filetypes=ftypes)
        if len(filename)>0:
            try:
                #in Linux, comment this line, it is not useful
                filename = filename+".jpg"
                #save image
                self.im.save(filename,"JPEG")
            except IOError:
                tkMessageBox.showerror("Error","Cannot save image!")

    def showImage(self):
        self.imTk = ImageTk.PhotoImage(self.im)
        self.lbl.destroy()
        self.lbl = Label(self.mainwindow, image=self.imTk)
        self.lbl.pack()

    def imgRestore(self):
        self.im = self.imOrigin.copy()
        self.showImage()

    def imgRotate(self):
        self.im = self.im.rotate(45)
        self.showImage()

#---Main app starts here---
root = Tk()
app = MainApp(root)
#create menu
app.createMenu()
root.mainloop()

No comments:

Post a Comment