¿Cómo puedo convertir el contenido del canvas en una imagen?

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

Quiero convertir el contenido del canvas en un bitmap u otra imagen, y luego hacer otras operaciones, como rotar o escalar la imagen, o cambiar sus coordenadas.

Los mapas de bits pueden mejorar la eficiencia para mostrar si ya no estoy dibujando.

¿Qué tengo que hacer?

Puede generar un documento postscript (para incorporarlo a otra herramienta: 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() 

o dibuje la misma imagen en paralelo en PIL y en el canvas de Tkinter (consulte: Cómo guardar un dibujo de canvas de Tkinter (Python) ). Por ejemplo (inspirado en el mismo artículo):

 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() 

He encontrado una gran manera de hacer esto que es realmente útil. Para ello, necesita el módulo PIL. Aquí está el código:

 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") 

Lo que esto hace es pasar un nombre de widget a la función. El comando root.winfo_rootx() y root.winfo_rooty() obtienen la posición de píxel de la root.winfo_rooty() superior izquierda de la ventana root general.

Luego, se widget.winfo_x() y widget.winfo_y() , básicamente solo se obtiene la coordenada de píxeles del píxel superior izquierdo del widget que desea capturar (en píxeles (x, y) de su pantalla) .

Luego encuentro el (x1, y1) que es el píxel inferior izquierdo del widget. El ImageGrab.grab() hace una pantalla de impresión, y luego lo recorte para obtener solo el bit que contiene el widget. Aunque no es perfecta, y no hará la mejor imagen posible, esta es una gran herramienta para obtener una imagen de cualquier widget y guardarla.

Si tienes alguna duda, publica un comentario! Espero que esto haya ayudado!

Utilice la almohada para convertir de Postscript a PNG

 from PIL import Image def save_as_png(canvas,fileName): # save postscipt image canvas.postscript(file = fileName + '.eps') # use PIL to convert to PNG img = Image.open(fileName + '.eps') img.save(fileName + '.png', 'png')