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).
Mais quand je dessine un "A", l'image de sortie semble un peu bizarre.
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?