Comment convertir un contenu canvas en image?

from Tkinter import *
root = Tk()
cv = Canvas(root)
cv.create_rectangle(10,10,50,50)
cv.pack()
root.mainloop()

je veux convertir le contenu de la toile en image bitmap ou autre, et ensuite faire d'autres opérations, comme tourner ou mettre à l'échelle l'image, ou changer ses coordonnées.

Bitmaps peut améliorer l'efficacité pour montrer si Je ne dessine plus.

Que dois-je faire?

16
demandé sur Pops 2012-03-27 12:59:02

2 réponses

Vous pouvez soit générer un document postscript (pour alimenter un autre outil: ImageMagick, Ghostscript, etc):

from Tkinter import *
root = Tk()
cv = Canvas(root)
cv.create_rectangle(10,10,50,50)
cv.pack()
root.mainloop()

cv.update()
cv.postscript(file="file_name.ps", colormode='color')

root.mainloop()
enregistrer un dessin de toile Tkinter (Python)). Par exemple (inspiré par le même article):

from Tkinter import *
import Image, ImageDraw

width = 400
height = 300
center = height//2
white = (255, 255, 255)
green = (0,128,0)

root = Tk()

# Tkinter create a canvas to draw on
cv = Canvas(root, width=width, height=height, bg='white')
cv.pack()

# PIL create an empty image and draw object to draw on
# memory only, not visible
image1 = Image.new("RGB", (width, height), white)
draw = ImageDraw.Draw(image1)

# do the Tkinter canvas drawings (visible)
cv.create_line([0, center, width, center], fill='green')

# do the PIL image/draw (in memory) drawings
draw.line([0, center, width, center], green)

# PIL image can be saved as .png .jpg .gif or .bmp file (among others)
filename = "my_drawing.jpg"
image1.save(filename)

root.mainloop()
22
répondu Nif 2012-05-03 13:55:26

j'ai trouvé un excellent moyen de faire ce qui est vraiment utile. Pour cela, vous avez besoin du module PIL. Voici le code:

from PIL import ImageGrab

def getter(widget):
    x=root.winfo_rootx()+widget.winfo_x()
    y=root.winfo_rooty()+widget.winfo_y()
    x1=x+widget.winfo_width()
    y1=y+widget.winfo_height()
    ImageGrab.grab().crop((x,y,x1,y1)).save("file path here")

Cela fait que vous passez un nom de widget dans la fonction. La commande root.winfo_rootx() et root.winfo_rooty() obtenir la position en pixels du haut et à gauche de l'ensemble de l' root la fenêtre.

widget.winfo_x() et widget.winfo_y() sont ajoutés, essentiellement il suffit d'obtenir la coordonnée pixel du pixel en haut à gauche du widget que vous voulez capturer (à pixels (x,y) de votre écran).

je trouve alors le (x1,y1) qui est le pixel inférieur gauche du widget. ImageGrab.grab() fait un écran d'impression, et je le recadrer ensuite pour obtenir seulement le morceau contenant le widget. Bien que pas parfait, et ne fera pas la meilleure image possible, c'est un excellent outil pour obtenir une image de n'importe quel widget et de le sauvegarder.

Si vous avez des questions, postez un commentaire! Espérons que cela a aidé!

14
répondu B.Jenkins 2017-06-29 15:55:30