我的问题是,在“清理”画布后,当我从D:/Folder/my_drawing.jpg
中查询图像时,画布上的先前绘制的图像很脏。画布在视觉上是透明的,但是会累积以前的绘制图像和新的图像。我们的目标是制作一个类似于Paint的程序,该程序允许保存绘制并带有一个用于清理所有画布的按钮。
其行为如下: 首先,我先画曲线,然后清洁画布,然后再画线,当我查阅图像时,打开文件,图像的组成如下图所示:
这是Python中的代码:
import os
from tkinter import *
from PIL import Image, ImageDraw
class Paint(object):
def __init__(self):
self.root = Tk()
self.pen_button = self.use_pen
self.save_button = Button(self.root, text='Save', command=self.Save)
self.save_button.grid(row=0, column=3)
self.eraser_button = Button(self.root, text='Clean canvas', command=self.use_eraser)
self.eraser_button.grid(row=0, column=1)
self.c = Canvas(self.root, bg='white', width=600, height=600)
self.c.grid(row=1, columnspan=5)
self.setup()
self.root.mainloop()
def activate_button(self, some_button):
self.active_button = some_button
def use_pen(self):
self.activate_button(self.pen_button)
def setup(self):
self.path=''
self.old_x = None
self.old_y = None
self.image1 = Image.new("RGB",(600,600),'white')
self.draw = ImageDraw.Draw(self.image1)
self.active_button = self.pen_button
self.c.bind('<B1-Motion>', self.paint)
self.c.bind('<ButtonRelease-1>', self.reset)
def use_eraser(self):
self.c.delete(ALL)
def Save(self):
self.c.postscript(file="my_drawing.jpg", colormode='color')
filename = "my_drawing.jpg"
self.image1.save(filename)
def paint(self, event):
self.line_width = 2.0
paint_color = 'black'
if self.old_x and self.old_y:
self.c.create_line(self.old_x, self.old_y, event.x, event.y,
width=self.line_width, fill=paint_color, dash=(),capstyle=ROUND, smooth=TRUE, splinesteps=36)
self.draw.line([self.old_x, self.old_y, event.x, event.y], fill="black", width=5)
self.old_x = event.x
self.old_y = event.y
def reset(self, event):
self.old_x, self.old_y = None, None
if __name__ == '__main__':
Paint()
答案 0 :(得分:0)
是的,嗯,您实际上从未在画布上显示图像。
在功能paint()
中,您首先在画布上绘制一条线段,然后在图像中绘制它。
函数use_eraser()
清除画布,但对图像self.image1
不执行任何操作。
因此,请勿在画布上绘制任何内容,而仅在图像上绘制任何内容,然后在画布上显示图像。我在PIL
上工作不多,但是我认为图像显示会随着您的绘画而自动更新。
答案 1 :(得分:0)
我已通过此更改解决了该问题。我希望它对另一个具有相同问题的人有用。
import io
def Save(self):
ps=self.c.postscript(colormode='color')
img = Image.open(io.BytesIO(ps.encode('utf-8')))
img.save('D:/Folder/my_drawing.jpg')
def paint(self, event):
self.line_width = 2.0
paint_color = self.color
if self.old_x and self.old_y:
self.c.create_line(self.old_x, self.old_y, event.x, event.y,
width=self.line_width, fill=paint_color, dash=(),
capstyle=ROUND, smooth=TRUE, splinesteps=36)
self.old_x = event.x
self.old_y = event.y