Как я могу преобразовать содержимое холста в изображение?

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

Я хочу преобразовать содержимое холста в растровое изображение или другое изображение, а затем выполнить другие операции, такие как поворот или масштабирование изображения или изменение его координат.

Растровые изображения могут повысить эффективность, чтобы показать, если я больше не рисую.

Что я должен делать?

 liupeixin28 мар. 2012 г., 03:57
В Actionscript он имеет функцию draw (), чтобы понять, как работать в Python Tkinter?

Ответы на вопрос(2)

Решение Вопроса

ругой инструмент: ImageMagick, Ghostscript и т. Д.):

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

или нарисуйте одно и то же изображение параллельно на PIL и холсте Ткинтера (см .:Сохранение рисунка холста Tkinter (Python)). Например (вдохновленный той же статьей):

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()
 volperossa08 нояб. 2018 г., 00:22
когда я пытаюсь конвертировать в postscript, он изменяет размеры моего изображения (сохраненный postscript меньше по сравнению с canvas); Почему??
 Camion03 дек. 2018 г., 15:03
Так как postscript - векторный формат, я не думаю, что это должно быть проблемой.

который действительно полезен. Для этого вам понадобится модуль PIL. Вот код:

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

Это значит, что вы передаете имя виджета в функцию. Командаroot.winfo_rootx() иroot.winfo_rooty() получить положение пикселя в верхнем левом углу от общегоroot окно.

Затемwidget.winfo_x() а такжеwidget.winfo_y() добавляются, в основном просто получить координату пикселя верхнего левого пикселя виджета, который вы хотите захватить (в пикселях (x, y) вашего экрана).

Затем я нахожу (x1, y1), который является нижним левым пикселем виджета.ImageGrab.grab() делает экран печати, а затем я обрезаю его, чтобы получить только бит, содержащий виджет. Хотя он не идеален и не создаст наилучшего возможного изображения, это отличный инструмент для получения изображения любого виджета и его сохранения.

Если у вас есть какие-либо вопросы, оставьте комментарий! Надеюсь, это помогло!

 B.Jenkins03 февр. 2017 г., 18:03
@EerikMuuli Во-первых, вместо PIL вы используете модуль pyscreenshot, поэтому я не совсем уверен, как это работает. Поскольку PIL может делать скриншоты и много других функций, я бы просто получил модуль PIL. Кроме того, похоже, что вы просто хотите сделать холст, а они делают изображение прямоугольника. Есть более простые способы сделать это! Чтобы сделать это по-своему, затем используйте PIL и функцию сохранения, которые я использовал в своем ответе, и если вы действительно хотите выйти после того, как сделали снимок экрана, то просто введите команду exit () или, предпочтительно, root.destroy (). в определении функции геттера.
 E. Muuli01 февр. 2017 г., 20:14
Хорошо, я выяснил, в чем проблема - я вставлю свой код сюда. Теперь сценарий делает то, что он печатает холст дважды и сталкивается с ошибкой - хотя он должен открыть его один раз и закрыть через 4,5 секунды. Это также печатает "wut" 2 раза, что действительно странно. Вот код:pastebin.com/MPgABMEv
 E. Muuli30 янв. 2017 г., 17:57
Привет, когда я запускаю код, он делает изображение слишком рано. Можете ли вы опубликовать пример сценария с графикой tkinter и затем сохранить его? Возможно я помещаю или вызываю функцию в неправильное время.
 B.Jenkins31 янв. 2017 г., 21:11
@EerikMuuli Вы должны вызывать функцию только тогда, когда хотите сделать снимок. Например, вы можете получить кнопку с командой, а в функции для команды кнопки просто поставитьgetter(x) где х - это виджет или даже целое корневое окно. Это должно быть без проблем. Если у вас есть дальнейшие проблемы, просто ответьте в комментарии здесь.
 martineau29 июн. 2017 г., 18:13
Прекрасный подход! Намного лучше, чем пытаться повторить все команды рисования на чистом изображении PIL или создать вывод Postscipt и использовать другой инструмент для преобразования его в изображение. Обратите внимание, что вместо захвата всего экрана и его обрезки, это можно сделать за один шаг,ImageGrab.grab((x,y,x1,y1)).save("file path here") (видетьImageGrab.grab() документы). Следует также указать, что данное расширение имени файла определяет формат создаваемого файла изображения.

Ваш ответ на вопрос