android canvas 清空画布,清除canvas画布内容(点擦除+线擦除)

本文详细介绍了如何清空Android Canvas画布,包括通过重置宽高和使用clearRect方法。此外,还探讨了globalCompositeOperation属性在制作橡皮擦效果中的应用,特别强调了destination-out值可用于清除现有像素。同时,文章还展示了实现线条的点擦除和线擦除的存储和绘制策略,通过保存线条点坐标并根据橡皮擦位置动态更新线条数据。
摘要由CSDN通过智能技术生成

清空canvas画布内容

1、重置宽或高

由于canvas每当高度或宽度被重设时,画布内容就会被清空,因此可以用以下方法清空:(此方法仅限需要清除全部内容的情况)

var c=document.getElementById("myCanvas");

c.width=c.width;

2、clearRect

var c=document.getElementById("myCanvas");

var ctx=c.getContext("2d");

ctx.fillStyle="red";

ctx.fillRect(0,0,300,150);

ctx.clearRect(20,20,100,50);

7edc08afa0962f98027b0e222f8c0ed6.png

3、globalCompositeOperation

引用globalCompositeOperation()函数,这个函数是用来在画布上组合颜色,我们可以利用这个原理,叠加(数学上的"或"原理)来制作橡皮。

首先看看globalCompositeOperation属性可以设置的值有哪些,分别是什么效果:

描述

source-over

默认。在目标图像上显示源图像。

source-atop

在目标图像顶部显示源图像。源图像位于目标图像之外的部分是不可见的。

source-in

在目标图像中显示源图像。只有目标图像内的源图像部分会显示,目标图像是透明的。

source-out

在目标图像之外显示源图像。只会显示目标图像之外源图像部分,目标图像是透明的。

destination-over

在源图像上方显示目标图像。

destination-atop

在源图像顶部显示目标图像。源图像之外的目标图像部分不会被显示。

destination-in

在源图像中显示目标图像。只有源图像内的目标图像部分会被显示,源图像是透明的。

destination-out

在源图像外显示目标图像。只有源图像外的目标图像部分会被显示,源图像是透明的。

lighter

显示源图像 + 目标图像。

copy

显示源图像。忽略目标图像。

xor

使用异或操作对源图像与目标图像进行组合。

canvas

{

border:1px solid #d3d3d3;

margin-right:10px;

margin-bottom:20px;

}

var gco=new Array();

gco.push("source-atop");

gc

当然可以。以下是一个基本的KNN手写数字识别画布,使用了tkinter库: ```python import tkinter as tk from tkinter import messagebox import numpy as np from sklearn.neighbors import KNeighborsClassifier # 定义画布大小 CANVAS_WIDTH = 280 CANVAS_HEIGHT = 280 # 定义KNN分类器 knn = KNeighborsClassifier(n_neighbors=5) # 定义画布 class Canvas(tk.Canvas): def __init__(self, master, **kwargs): super().__init__(master, bg="white", **kwargs) self.bind("<Motion>", self.draw) self.bind("<Button-1>", self.start_draw) self.bind("<ButtonRelease-1>", self.stop_draw) self.x = self.y = 0 self.drawing = False def start_draw(self, event): self.drawing = True self.x = event.x self.y = event.y def stop_draw(self, event): self.drawing = False def draw(self, event): if self.drawing: self.create_line(self.x, self.y, event.x, event.y, width=20, capstyle=tk.ROUND, smooth=True) self.x = event.x self.y = event.y def clear(self): self.delete("all") # 定义主界面 class App(tk.Tk): def __init__(self): super().__init__() self.title("KNN手写数字识别") self.geometry(f"{CANVAS_WIDTH+20}x{CANVAS_HEIGHT+80}") self.canvas = Canvas(self, width=CANVAS_WIDTH, height=CANVAS_HEIGHT) self.canvas.pack(pady=10) self.predict_button = tk.Button(self, text="预测", command=self.predict) self.predict_button.pack(side=tk.LEFT, padx=10) self.clear_button = tk.Button(self, text="清空", command=self.clear_canvas) self.clear_button.pack(side=tk.LEFT) self.status_label = tk.Label(self, text="") self.status_label.pack(pady=10) def predict(self): # 将画布转换为数组 img = np.array(self.canvas.postscript(colormode="color"), dtype=np.uint8)[75:, 75:][:, :, :3] img = np.mean(img, axis=2) img = img / 255 img = 1 - img img = img.flatten() img = img.reshape(1, -1) # 加载训练好的KNN模型 knn_model = knn knn_model.fit(X_train, y_train) pred = knn_model.predict(img) # 显示预测结果 self.status_label.config(text=f"预测结果:{pred[0]}") def clear_canvas(self): self.canvas.clear() self.status_label.config(text="") if __name__ == "__main__": # 加载MNIST数据集 mnist = np.load("mnist.npz") X_train = mnist["x_train"] y_train = mnist["y_train"] # 限制数据集大小,以便更快地训练和预测 X_train = X_train[:5000] y_train = y_train[:5000] # 将图像转换为一维向量 X_train = X_train.reshape(X_train.shape[0], -1) # 启动应用程序 app = App() app.mainloop() ``` 该应用程序包括一个画布,用户可以在其上手写数字,并使用KNN模型进行预测。用户可以单击“预测”按钮以获取预测结果,或单击“清空”按钮以擦除画布。该应用程序还包括一个标签,用于显示预测结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值