2013-07-29 1 views
2

J'ai ce code qui permet à l'utilisateur de dessiner sur le canevas et de l'enregistrer sous forme de fichier jpeg.Python Tkinter enregistrer le canevas comme image en utilisant PIL

Comme mentionné dans this post, j'ai essayé de dessiner en parallèle sur la toile et en mémoire en utilisant le PIL afin que je puisse l'enregistrer comme jpeg au lieu de postscript. Il a semblé fonctionner jusqu'à ce que je découvre que certaines des images que j'ai sauvées avec PIL ne sont pas les mêmes que ce qui a été dessiné sur la toile.

Je suppose canvas.create_line et draw.line à partir du module de dessin d'image PIL de manière similaire et devrait donner une sortie similaire.

ci-dessous est ce qui a mal:

Par exemple, quand je dessine un « T », il semble bien (à gauche est mon dessin, est juste l'image enregistrée).

enter image description hereenter image description here

Mais quand je dessine un "A", l'image de sortie semble un peu bizarre.

enter image description hereenter image description here

Ceci est mon code actuel:

import Tkinter as tk 
import Image,ImageDraw 

class ImageGenerator: 
    def __init__(self,parent,posx,posy,*kwargs): 
     self.parent = parent 
     self.posx = posx 
     self.posy = posy 
     self.sizex = 200 
     self.sizey = 200 
     self.b1 = "up" 
     self.xold = None 
     self.yold = None 
     self.coords= [] 
     self.drawing_area=tk.Canvas(self.parent,width=self.sizex,height=self.sizey) 
     self.drawing_area.place(x=self.posx,y=self.posy) 
     self.drawing_area.bind("<Motion>", self.motion) 
     self.drawing_area.bind("<ButtonPress-1>", self.b1down) 
     self.drawing_area.bind("<ButtonRelease-1>", self.b1up) 
     self.button=tk.Button(self.parent,text="Done!",width=10,bg='white',command=self.save) 
     self.button.place(x=self.sizex/7,y=self.sizey+20) 
     self.button1=tk.Button(self.parent,text="Clear!",width=10,bg='white',command=self.clear) 
     self.button1.place(x=(self.sizex/7)+80,y=self.sizey+20) 

     self.image=Image.new("RGB",(200,200),(255,255,255)) 
     self.draw=ImageDraw.Draw(self.image) 

    def save(self): 
     print self.coords 
     self.draw.line(self.coords,(0,128,0),width=3) 
     filename = "temp.jpg" 
     self.image.save(filename) 

    def clear(self): 
     self.drawing_area.delete("all") 
     self.coords=[] 

    def b1down(self,event): 
     self.b1 = "down" 

    def b1up(self,event): 
     self.b1 = "up" 
     self.xold = None 
     self.yold = None 

    def motion(self,event): 
     if self.b1 == "down": 
      if self.xold is not None and self.yold is not None: 
       event.widget.create_line(self.xold,self.yold,event.x,event.y,smooth='true',width=3,fill='blue') 
       self.coords.append((self.xold,self.yold)) 

     self.xold = event.x 
     self.yold = event.y 

if __name__ == "__main__": 
    root=tk.Tk() 
    root.wm_geometry("%dx%d+%d+%d" % (400, 400, 10, 10)) 
    root.config(bg='white') 
    ImageGenerator(root,10,10) 
    root.mainloop() 

Où est-ce que je me trompe et que dois-je faire pour sauver exactement la même image qui est dessinée sur la toile comme une image jpeg?

Répondre

5

J'ai réussi à résoudre mon problème. En fait, j'étais juste stupide. Même si canvas.create_line et draw.line ont la même fonction, je n'ai pas utilisé les mêmes données exactes pour extraire les deux images. après avoir fait des changements, c'est mon code de travail.

import Tkinter as tk 
import Image,ImageDraw 

class ImageGenerator: 
    def __init__(self,parent,posx,posy,*kwargs): 
     self.parent = parent 
     self.posx = posx 
     self.posy = posy 
     self.sizex = 200 
     self.sizey = 200 
     self.b1 = "up" 
     self.xold = None 
     self.yold = None 
     self.drawing_area=tk.Canvas(self.parent,width=self.sizex,height=self.sizey) 
     self.drawing_area.place(x=self.posx,y=self.posy) 
     self.drawing_area.bind("<Motion>", self.motion) 
     self.drawing_area.bind("<ButtonPress-1>", self.b1down) 
     self.drawing_area.bind("<ButtonRelease-1>", self.b1up) 
     self.button=tk.Button(self.parent,text="Done!",width=10,bg='white',command=self.save) 
     self.button.place(x=self.sizex/7,y=self.sizey+20) 
     self.button1=tk.Button(self.parent,text="Clear!",width=10,bg='white',command=self.clear) 
     self.button1.place(x=(self.sizex/7)+80,y=self.sizey+20) 

     self.image=Image.new("RGB",(200,200),(255,255,255)) 
     self.draw=ImageDraw.Draw(self.image) 

    def save(self): 
     filename = "temp.jpg" 
     self.image.save(filename) 

    def clear(self): 
     self.drawing_area.delete("all") 
     self.image=Image.new("RGB",(200,200),(255,255,255)) 
     self.draw=ImageDraw.Draw(self.image) 

    def b1down(self,event): 
     self.b1 = "down" 

    def b1up(self,event): 
     self.b1 = "up" 
     self.xold = None 
     self.yold = None 

    def motion(self,event): 
     if self.b1 == "down": 
      if self.xold is not None and self.yold is not None: 
       event.widget.create_line(self.xold,self.yold,event.x,event.y,smooth='true',width=3,fill='blue') 
       self.draw.line(((self.xold,self.yold),(event.x,event.y)),(0,128,0),width=3) 

     self.xold = event.x 
     self.yold = event.y 

if __name__ == "__main__": 
    root=tk.Tk() 
    root.wm_geometry("%dx%d+%d+%d" % (400, 400, 10, 10)) 
    root.config(bg='white') 
    ImageGenerator(root,10,10) 
    root.mainloop() 
Questions connexes