首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用PIL图像和ImageDraw函数将Python画布绘图保存为图像文件的问题

使用PIL图像和ImageDraw函数将Python画布绘图保存为图像文件的问题
EN

Stack Overflow用户
提问于 2022-11-27 16:25:56
回答 1查看 32关注 0票数 -1

问题陈述

我用Python编写了一段代码,用户可以在此代码上使用tkinter画布。该程序能够获取应用程序的屏幕快照,但将画布内容保存到可查看的图像文件(如.jpg或.png)还没有正确完成。

截图

我在tkinter应用程序的画布上画的东西。

代码(如下所示)保存的内容。

我所期望的。

我已经试过了,而且还会期待

一些可能的互联网解决方案(包括堆栈溢出)已经尝试过,但不知怎么的,这个过程无法成功地完成。在画布上画完任何东西之后,保存的图像将只有一个点,不管它是在*.jpg还是*.png中。我需要整个画布的图像与所有的彩色图纸在它保存的图像文件。

对于任何参考,这是我的代码

代码语言:javascript
运行
复制
from tkinter import Tk, Canvas, Button
from PIL import Image, ImageDraw

X = 0
Y = 0

app = Tk()


def set_xy(click):
    global X, Y
    X, Y = click.x, click.y


def draw_line(drag):
    global X, Y
    draw_panel.create_line((X, Y, drag.x, drag.y), fill="black", capstyle="round", smooth=True)
    draw.line([(X, Y), (drag.x, drag.y)], fill="black", joint="curve")
    X, Y = drag.x, drag.y


def save(event=None):
    # ATTENTION: This is not working properly
    image.save("image.png", "png")


# App's drawing panel
draw_panel = Canvas(app, background="white", cursor="dot")
draw_panel.place(x=0, relwidth=1.0, y=0, relheight=1.0)

# Invisible canvas for saving as an image later on
image = Image.new("RGB", (draw_panel.winfo_width(), draw_panel.winfo_height()), "white")
draw = ImageDraw.Draw(image)

# Mouse and Key bindings
draw_panel.bind('<Button-1>', set_xy)
draw_panel.bind('<B1-Motion>', draw_line)
app.bind('<s>', save)  # press 's' to save the drawing as .png

app.mainloop()

补充资料:

  • 主机: Windows 10版本20H2 (操作系统构建19042.2130)
  • IDE: PyCharm 2022.2 (社区版)(构建#PC-222.3345.131)
  • 语言:Python3.10.6
  • 框架:tkinter /TCL8.6
  • 图书馆:枕头9.2.0

任何解决办法都将受到高度赞赏,我将感激。

EN

回答 1

Stack Overflow用户

发布于 2022-12-02 06:16:06

这是个好主意,只少了一块。在第一次调用mainloop()之前,将图像的大小设置为画布的大小。画布此时没有大小,因为窗口尚未启动。

在获得宽度和高度之前,需要强制进行更新。然后,它工作得很好:

代码语言:javascript
运行
复制
# Invisible canvas for saving as an image later on
draw_panel.update()
image = Image.new("RGB", (draw_panel.winfo_width(), draw_panel.winfo_height()), "white")
draw = ImageDraw.Draw(image)

如果您在调用更新之前和之后打印draw_panel.winfo_width(),您将看到我的意思。在update()之前,宽度和高度都是1,之后,它们应该是200。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74591756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档