Canvas画布基本功能及实现网页签名功能

news2024/12/28 5:48:53

canvas 简介

<canvas> 是 HTML5 新增的,一个可以使用脚本(通常为 JavaScript) 在其中绘制图像的 HTML 元素。它可以用来制作照片集或者制作简单(也不是那么简单)的动画,甚至可以进行实时视频处理和渲染。和所有 DOM 元素一样,拥有自己的属性、方法和事件,其中包含绘图的方法。

​它最初由苹果内部使用自己 MacOS X WebKit 推出,供应用程序使用像仪表盘的构件和 Safari 浏览器使用。后来,有人通过 Gecko 内核的浏览器 (尤其是 Mozilla和Firefox),Opera 和 Chrome 和超文本网络应用技术工作组建议为下一代的网络技术使用该元素。

​Canvas 是由 HTML 代码配合高度和宽度属性而定义出的可绘制区域。JavaScript 代码可以访问该区域,类似于其他通用的二维 API,通过一套完整的绘图函数来动态生成图形。通过 JavaScript 脚本可以调用绘图 API 在网页上完成绘图功能。

Canvas 是 HTML5 中最强大的特性之一。允许开发者使用动态和交互的方法,在 Web 上实现桌面应用程序的功能。

​ Mozilla 程序从 Gecko 1.8 (Firefox 1.5) 开始支持 <canvas>, Internet Explorer 从 IE9 开始 <canvas> 。Chrome 和 Opera 9+ 也支持 <canvas>。

Canvas 是 HTML5 新推出的元素标签,用户图形绘制。

canvas基本使用

     Canvas 元素可以在网页中创建一个空白的矩形区域。

  通过 API(JavaScript)可以操作这个区域。

  默认情况下,创建的 Canvas 元素没有边框和内容。

<canvas id="canvasBox" width="" height=""></canvas>
<!--
注解:
 canvas必须是闭合标签</canvas>不可省,如果省略文档的其他内容将不会显示
只有两个属性width和height如果没用设置宽高默认宽300高150

-->

        js文件中:

const canvasBox=document.querySelector("#canvasbox");//获取画布元素
const ctx=canvasBox.getContext(contextType);
/*获取渲染上下文(具备了绘制和处理展示内容的能力)
contextType参数有
2d:绘制2d图像(创建一个CanvasRenderingContext2D对象作为2d渲染的上下文)
webgl(experimental-webgl)、webgl2:绘制3d图像(实验性)
bitmaprenderer:把位图绘制在canvas上下文上(实验性)
*/

        下面是 Canvas 的基本方法:

         获取 Canvas 上下文对象

                 使用 canvas.getContext('2d') 方法可以获取绘图上下文对象,例如:

const canvas = document.getElementById('mycanvas');
const ctx = canvas.getContext('2d');

         绘制形状及填充颜色

                 使用绘图上下文对象的 fillRect()strokeRect() 方法添加矩形,使用 fill()stroke() 填充或者描边形状;使用 fillStylestrokeStyle 属性设置形状内部或外部的颜色,例如:

ctx.fillStyle = 'red';
ctx.fillRect(10, 10, 100, 100);

         绘制图像

                 使用 drawImage() 方法绘制图像,它可以将图片、画布或视频作为图像绘制到画布上,例如:

const img = new Image();
img.onload = function() {
    ctx.drawImage(img, 0, 0);
}
img.src = 'example.png';

         绘制文本

                 使用 fillText()strokeText() 方法绘制文本,例如:

ctx.font = '20px Arial';
ctx.fillText('Hello World!', 50, 50);

         绘制路径

                 使用 beginPath() 开始路径,然后使用 moveTo() 移动当前点,使用 lineTo()arc()quadraticCurveTo() 创建路径,最后使用 fill()stroke() 方法绘制路径,例如:

ctx.beginPath();
ctx.moveTo(10, 10);
ctx.lineTo(50, 50);
ctx.stroke();

         以上是 Canvas 的基本方法,还有很多高级的方法可以用于绘制复杂图形或动画,这里就不一一说了,具体可以去看看api。

 Canvas示例:实现网页签名功能        

        开发中,偶尔会遇到签名功能,使用 Canvas 可以方便地实现签名功能,以下是一个简单的示例:

 HTML 代码:

<div>
  <canvas id="signatureCanvas" width="300" height="200"></canvas>
  <button onclick="clearSignature()">清除</button>
  <button onclick="saveSignature()">保存</button>
</div>

 JavaScript 代码:

const canvas = document.getElementById('signatureCanvas');
const ctx = canvas.getContext('2d');

let isDrawing = false;
let lastX, lastY;

// 鼠标按下事件
function handleMouseDown(e) {
  isDrawing = true;
  [lastX, lastY] = [e.clientX - canvas.offsetLeft, e.clientY - canvas.offsetTop];
}

// 鼠标移动事件
function handleMouseMove(e) {
  if (!isDrawing) return; // 如果鼠标没有按下,则退出函数

  const x = e.clientX - canvas.offsetLeft;
  const y = e.clientY - canvas.offsetTop;

  ctx.beginPath();
  ctx.moveTo(lastX, lastY);
  ctx.lineTo(x, y);
  ctx.stroke();

  [lastX, lastY] = [x, y];
}

// 鼠标释放事件
function handleMouseUp() {
  isDrawing = false;
}

// 清除签名
function clearSignature() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
}

// 保存签名
function saveSignature() {
  const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);

  // 将图片数据转换成 base64 格式
  const base64ImageData = canvas.toDataURL();
  console.log(base64ImageData);
}

// 绑定事件
canvas.addEventListener('mousedown', handleMouseDown);
canvas.addEventListener('mousemove', handleMouseMove);
canvas.addEventListener('mouseup', handleMouseUp);

        一个简单的签名功能就实现了:

上述代码使用 Canvas 绘图 API,监听鼠标按下、移动和释放的事件,并在鼠标移动时绘制签名。同时也提供了清除签名和保存签名功能。其中,ctx.getImageData() 函数可以获取到画布中的图片数据,可以将其转换成 base64 格式,以便于保存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/591399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python中累乘的作用和用法

Python中累乘的作用和用法 在Python编程语言中&#xff0c;累乘指的是连续乘法&#xff0c;或者说是一系列数字的乘积。累乘的概念非常简单&#xff0c;但是实际上它在编程中有着广泛的应用。 累乘在Python中的实现方式 Python中&#xff0c;累乘可以通过多种方式来实现&…

手写一个webpack插件(plugin)

熟悉 vue 和 react 的小伙伴们都知道&#xff0c;在执行过程中会有各种生命周期钩子&#xff0c;其实webpack也不例外&#xff0c;在使用webpack的时候&#xff0c;我们有时候需要在 webpack 构建流程中引入自定义的行为&#xff0c;这个时候就可以在 hooks 钩子中添加自己的方…

使用docker和minio实现对象存储

文章目录 使用docker和minio实现对象存储什么是minio安装minio使用minio 使用docker和minio实现对象存储 什么是minio ​ Minio是一个开源的分布式文件存储系统&#xff0c;它基于 Golang 编写,虽然轻量&#xff0c;却拥有着不错的高性能&#xff0c;可以将图片、视频、音乐、…

Sequelize:Node.js 中的强大 ORM 框架

❤️砥砺前行&#xff0c;不负余光&#xff0c;永远在路上❤️ 目录 前言优势&#xff1a;提高效率&#xff0c;不用SQL即可完成数据库操作。 那什么是 Sequelize&#xff1f;主要特性&#xff1a;1、模型定义和映射&#xff1a;2、关联和联接&#xff1a;3、事务管理&#xff…

Java性能权威指南-总结2

Java性能权威指南-总结2 性能测试方法原则2:理解批处理流逝时间、吞吐量和响应时间批处理流逝时间吞吐量测试 原则3:用统计方法应对性能的变化 性能测试方法 原则2:理解批处理流逝时间、吞吐量和响应时间 性能测试的第2条原则是多角度审视应用性能。应该测量哪个指标取决于对…

chatgpt赋能python:Python中的与非

Python中的与非 在Python编程中&#xff0c;我们经常会用到与非运算符&#xff0c;用来判断条件语句中的真假性。在本文中&#xff0c;我们将介绍Python中的与非运算符&#xff0c;并探讨其用法和实际应用场景。 什么是与非运算符&#xff1f; 与非运算符是一个布尔操作符&a…

NeRF-SLAM代码记录

前言 没运行成功,尤其是编译gtsam部分,每一步都有错,又是讨厌c++第一天。 这一行编译到92% 就会报错 python/CMakeFiles/gtsam_py.dir/build.make:250: recipe for target python/CMakeFiles/gtsam_py.dir/linear.cpp.o failed make[2

.NET 8 Preview 4 发布

作者&#xff1a;Jon Douglas - Principal Program Manager, NuGet 翻译&#xff1a;Alan Wang 排版&#xff1a;Alan Wang 我们很高兴与大家分享在 .NET 8 预览版 4 中的所有新功能和改进&#xff01;这次发布是继预览版 3之后的更新。您将在这些月度发布中看到更多功能逐渐亮…

【无标题】win11打开VMware虚拟机蓝屏解决

win11打开VMware虚拟机蓝屏解决 win11打开虚拟机蓝屏&#xff01;&#xff01;&#xff01;解决方案&#xff1a;win11支持16.2以上版本&#xff0c;其他版本不兼容&#xff0c;可用文末的卸载工具卸载之前已安装版本&#xff08;深度卸载&#xff09;&#xff0c;然后下载16.2…

chatgpt赋能python:Python中的乘号:一个重要的数学运算符

Python中的乘号&#xff1a;一个重要的数学运算符 在 Python 编程语言中&#xff0c;乘号通常是使用“*”表示的数学运算符。这个运算符非常常用&#xff0c;它可以在各种情况下使用。本文将探讨 Python 中乘号的基本用法&#xff0c;以及更高级的用法。 基本用法 在 Python…

python+django高校人事管理系统vue

本高校人事管理系统以Django作为框架&#xff0c;Python语言&#xff0c;B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块&#xff1a;用户、院长、职称申报、工资信息、绩效信息、奖惩信息、招聘、科系分类等模块。 本文着重阐述了高校人事管理系统的分析、…

easyX实践上手操作小项目

easyX实践上手操作小项目 效果展示主菜单的装饰玩法介绍界面开始游戏界面制作团队界面排行榜界面注&#xff1a;main()函数拓展数据库小结 这里我们学习过easyX的基础知识后&#xff0c;看看是否能实践操作一下&#xff0c;制作一个属于自己的游戏界面呢&#xff1f; 基础知识…

基于深度学习的高精度野生目标检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度野生目标检测识别系统可用于日常生活中检测与定位野生目标目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的野生目标目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测…

开源SCRM营销平台MarketGo-账号管理

一、概述 企业在经营的过程中&#xff0c;因为业务、税收等各种因素的需要在各地成立分公司&#xff0c;这样针对公司来说管理成本&#xff0c;运营成本&#xff0c;营销成本都会提高&#xff0c;并且沟通的效率也会变低。 在用户营销的场景中&#xff0c;MarketGo在SCRM做了…

C++ stack容器介绍

&#x1f914;stack容器介绍&#xff1a; &#x1f4d6; stack是一种数据结构&#xff0c;也可以被称为堆栈。它是一个容器&#xff0c;只允许在最顶层进行插入和删除&#xff0c;并且只能访问最后一个插入的元素。这个元素称为栈顶。所有新插入的元素都被放置在栈顶上面&#…

【C++入门】什么是引用

目录 一、引用概念 二、引用特性 三、常引用 四、使用场景 1. 做参数 2. 做返回值 五、传值&#xff0c;传引用效率比较 六、引用和指针的区别 一、引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取一个别名&#xff0c;编译器不会为引用变量开辟内存空间…

【C/C++】之内存管理(超详细练气篇)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

AI绘画能力的起源:通俗理解VAE、扩散模型DDPM、DETR、ViT/Swin transformer

前言 2018年我写过一篇博客&#xff0c;叫&#xff1a;《一文读懂目标检测&#xff1a;R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD》&#xff0c;该文相当于梳理了2019年之前CV领域的典型视觉模型&#xff0c;比如 2014 R-CNN2015 Fast R-CNN、Faster R-CNN2016 YOLO、SSD2…

Seata 分布式事务-应用实例

Seata 分布式事务-应用实例 需求分析/图解 需求&#xff1a;完成下订单功能&#xff0c;由三个微服务模块协同完成, 涉及到多数据库, 多张表 分析 黑色线是执行顺序线 红色线是想Seata Server注册 最后紫色线是决定是否提交和回滚 项目目录 主题包结构都是一样的但是类名字…

eventfd 和 epoll 的结合使用

一.eventfd介绍 eventfd 是 Linux 的一个系统调用&#xff0c;创建一个文件描述符用于事件通知&#xff0c;自 Linux 2.6.22 以后开始支持。 接口及参数介绍 #include <sys/eventfd.h> int eventfd(unsigned int initval, int flags);eventfd() 创建一个 eventfd 对象&…