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

2023-10-27

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 格式,以便于保存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Canvas画布基本功能及实现网页签名功能 的相关文章

  • 跨域iframe自动调整大小

    我正在使用 iframe 和 javascript 制作一个 Web 小部件 我想让我的 iframe 能够根据其内容 从其他域加载 调整大小 我做了一些搜索 包括在 Stack Overflow 上 我找到了几个主题 但我找不到关于这个问
  • 我无法注入带有“!important”规则的样式[重复]

    这个问题在这里已经有答案了 我尝试使用以下代码注入样式 document body style color green important Per CSS 级联引用 http www w3 org TR CSS2 cascade html
  • 在 Javascript 中,有什么方法可以知道从哪个主机脚本加载?

    在javascript中 作为从某个主机加载的脚本 有什么方法可以知道我是从哪个服务器 主机加载的 我需要向该主机发出额外的 ajax 请求 并且更愿意动态地找出主机 因此 如果您在页面上包含 javascript 文件 当该 javasc
  • 当名称是数组时如何使用 Javascript 修改 HTML Select

    我有两个同名的 html select 对象 它们是具有不同索引的数组 我想做的是 如果从类别 0 选择元素中选择 关闭 我想禁用类别 1 元素 我一直在尝试使用 document getElementsByName 但无法弄清楚如何专门针
  • 通过搜索查找下一个文本并突出显示不起作用

    当在搜索框中搜索任何文本时 它可以找到并突出显示正确的文本 但是当搜索下一个 新文本时 它无法找到下一个 新文本 再次搜索时它不起作用 我无法找到问题 这JS below JS button search click function va
  • 标点符号加载“动画”,javascript?

    我正在寻找一种好方法来显示一些标点符号加载 动画 我想要的是这样的 This will display at second 1 Waiting for your input This will display at second 2 Wai
  • 使用什么事件来在选择文本框中的值时显示警报消息

    我正在使用 jquery 的自动完成 api 来从数据库中获取名称 但是我想在从显示的文本框中选择名称时显示一条警报消息 我将显示一个图像以便更好地理解 当我输入 S 时 它将显示所有包含 S 的记录 所以问题是 如果我选择例如 Spars
  • 从 JavaScript 将参数传递给 p:remoteCommand

    我想将值传递给remoteCommand来自 JavaScript 如果这是可能的 我该如何做到这一点以及如何在支持 bean 中接收它们 对的 这是可能的 如何执行此操作取决于 PrimeFaces 版本 你可以在PrimeFaces 用
  • Angular - Safari 无法正确显示 DOM

    我是 Angular 的新手 使用 Angular 4 我尝试通过在关联的组件类文件中设置属性来更新特定元素 但是 除非我尝试强制重新绘制网页 通过调整窗口大小等 否则页面不会更新 我打开检查器 看到 DOM 已更改 但显示与元素检查器中的
  • 如何使用javascript隐藏div

    我想使用 Javascript 隐藏一个 div 下面是我的div div class ui dialog titlebar ui widget header ui corner all ui helper clearfix span cl
  • 以编程方式触发 highchart 散点图上某个点的单击事件

    实际上 我有一个小要求 其中有一个带有点列表和下拉列表的散点图 当我从下拉列表中选择一个项目时 应触发其相应的数据点单击 当我在图表上选择一个数据点时 必须执行一些操作 并且下拉列表应根据选择进行更新 我们有什么办法可以做到这一点吗 我尝试
  • apollo 客户端从存储中删除而不发生突变

    我需要通过 id 从本地存储中删除一条 记录 而不使用突变 因为服务器不支持突变 我尝试像这样手动访问商店 delete this apolloClient store getState apollo data 1112 这会删除记录 但是
  • 未处理的承诺拒绝:Zone.js 检测到 ZoneAwarePromise `(window|global).Promise` 已被覆盖

    我尝试将 Angular2 快速入门代码合并到我当前的 webpack 构建中 似乎有些东西正在覆盖zone js抛出此错误的承诺 根据我见过的大多数 stackoverflow 帖子 zone js文件需要在任何可能包含承诺的文件之后加载
  • 替换打字稿中字符串中字符的所有实例?

    我正在尝试用 x 字符替换电子邮件中的所有句号 例如 电子邮件受保护 cdn cgi l email protection 将变为 myxemail emailxcom 电子邮件设置为字符串 我的问题是它不只是替换句号 而是替换每个字符 所
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 需要根据用户选择有条件地渲染具有 X 行数的部分

    我有一个反应组件 其中包含一个下拉列表 其中的选项包括none 1 5 and 13 根据用户选择的数字 我需要渲染一个部分 其中包括许多行 每个行都有字段名称和下拉列表 如果用户不选择任何一个 我需要整个附加配置部分消失 新部分中的每个下
  • 如何修复带有单个道具的括号的 prettier 和 tslint 错误?

    我使用 prettier 和 tslint https github com alexjoverm tslint config prettier https github com alexjoverm tslint config prett
  • 在 React JSX 中返回配对元素

    问题 在 React 中 您希望通过映射数组来创建 DOM 结构 但数组中的每个项目应返回 2 个元素 例如 import React from react import from lodash let Component React ex
  • 将 javascript 变量作为参数传递给 @url.Action()

    是否可以将javascript变量作为参数传递给 url Action 因为据我所知可能存在服务器和客户端问题 我的要求是我必须根据过滤器下载文件 并进行ajax调用不适用于下载文件 所以我对 url Action 进行了编码 但无法实现这
  • 允许 iframe 跨域链接到目标父框架

    我有 2 个域 域 1 上的一个页面使用 iframe 加载域 2 中的内容 如何允许来自domain2 iframe 内 的链接在domain1 的完整父框架中打开 我一直在关注IE和w3c的新沙箱属性 http www w3 org T

随机推荐

  • 【从零开始的Java开发】2-8-2 CSS入门:CSS选择器、样式

    文章目录 CSS简介 CSS基础 CSS选择器 背景设置 使用外部样式表 样式 文本类样式 字体类样式 列表样式 伪类样式 CSS其他选择器 CSS选择器的优先级 CSS简介 CSS 即Cascading Style Sheets 层叠 样
  • WebRTC视频码率控制(二)—— QP检测

    WebRTC在视频编码过程中会进行QP检测 目的是让视频质量维持在可接受范围的前提下 调节整体视频表现 如分辨率 帧率 这里要注意的是 QP检测机制只是利用QP分析结果对分辨率 帧率进行调节 并不对编码QP做直接调整 说句题外话 通常编码器
  • Hausdorff distance

    微分动力系统原理 这本书里有介绍 Hausdorff距离是描述两组点集之间相似程度的一种量度 它是两个点集之间距离的一种定义形式 假设有两组集合A a1 ap B b1 bq 则这两个点集合之间的Hausdorff距离定义为 H A B m
  • Netcat 了解

    工作项目中遇到有用Netcat来实现Windows gt Macos通信 传输文件与数据的 所以想了解一下 Netcat 简称nc 是一款简单的Unix工具 使用UDP和TCP协议 它是一个可靠的容易被其他程序所启用的后台操作工具 同时它也
  • 计算机虚拟技术有什么用途,CPU虚拟化有什么作用?CPU怎么开启虚拟化技术?

    目前Intel和AMD的主流CPU都支持虚拟化技术 而搭配的主板BIOS中都自带了开启虚拟化技术的功能 但是主板出厂时默认禁用虚拟化技术的 如果我们如果需要使用CPU虚拟化技术 那么需要在主板中开启 那么CPU怎么开启虚拟化技术 下面装机之
  • 7-20 打印九九口诀表 (格式输出)

    下面是一个完整的下三角九九口诀表 1 1 1 1 2 2 2 2 4 1 3 3 2 3 6 3 3 9 1 4 4 2 4 8 3 4 12 4 4 16 1 5 5 2 5 10 3 5 15 4 5 20 5 5 25 1 6 6 2
  • linux对磁盘的管理员权限设置,Linux系统磁盘及文件系统管理

    本节索引 一 磁盘基本概念 二 磁盘分区管理 三 文件系统管理 四 设备挂载管理 一 磁盘基本概念 设备文件 Linux中一切皆文件 open read write close 设备类型 块设备 block 存储单位 块 磁盘 字符设备 c
  • 智能学习

    智能学习 MATLAB实现基于HS和谐搜索的时间序列未来多步预测 目录 智能学习 MATLAB实现基于HS和谐搜索的时间序列未来多步预测 效果一览 基本介绍 模型描述 程序设计 参考资料 效果一览 基本介绍 使用 Harmony Searc
  • docker部署redis集群配置文件笔记

    密码 requirepass 123456 指明为主机一的从机 slaveof 192 168 0 1 6389 主从redis同步的认证密码 与连接密码同 若不需要可不用配置 masterauth 123456 最大内存 maxmemor
  • 30条值得你借鉴的好习惯

    我有幸一直能生活在比较好的圈子中 我的优秀的同学 舍友 乃至我现在创业后遇到的优秀创业者 从他们身上看到和学到一些好的习惯 我一直觉得 好的习惯 是成功和进步的重要一点 我随手总结一些给大家 零散未经排版 当然 每个人有每个人的判断 这里可
  • 学术诚信的重要性_坚守学术道德,弘扬学术诚信

    霍楷 徐晨 摘 要 学车无辕而不立 人无信则不立 诚信乃为人之根本 学术诚信是个人行为秉性和学术道德品质的展现 反映了个体真实水准与学术涵养 培养学术道德意识 弘扬学术诚信精神 坚守学术诚信理念 净化学术环境是艺术类高校义不容辞的责任 提升
  • 基础12:高阶函数

    高阶函数 高阶函数英文叫 Higher order function 它的定义很简单 就是至少满足下列一个条件的函数 接受一个或多个函数作为输入 输出一个函数 也就是说高阶函数是对其他函数进行操作的函数 可以将它们作为参数传递 或者是返回它
  • springboot项目启动成功后执行一段代码的两种方式

    转自 https www cnblogs com zuidongfeng p 9926471 html 1 实现ApplicationRunner接口 package com lnjecit lifecycle import org spr
  • netcat小工具使用

    接收端 nc l 1789 gt test1 txt 发送端 nc 1 1 1 1 1789 lt test1 txt 使用nc传文件要比scp快不少 当然 安全性低了 root 12 nc h usage nc 46DdhklnrStUu
  • 小米笔记本pro开机出现no bootable devices

    用了4个月的小米笔记本开机突然出现no bootable devices 无法正常启动 很烦 如下图 上网查了资料 说是无法正确识别硬盘 然后 小米论坛的朋友 也有反馈 说很他们的小米笔记本也都出现了类似的情况 至今没有找到解决的方法 这可
  • 51单片机AD模数转换(SPI通信)

    一 AD DA介绍 AD AnalogtoDigital 模拟 数字转换 将模拟信号转换为计算机可操作的数字信号 DA Digital to Analog 数字 模拟转换 将计算机输出的数字信号转换为模拟信号 AD DA转换打开了计算机与模
  • python pandas定位表格中的某一单元并修改——at

    python pandas定位表格中的某一单元并修改 at 首先 我们创造一个用来进行测试的dataframe import pandas data aaa abc1 abc2 bbb bc1 bc2 ccc c1 c2 df pandas
  • Nacos安装详细过程

    本文来说下Nacos 注册中心 配置中心 安装详细过程 文章目录 初识Nacos Nacos开发必知 安装Nacos 本文小结 初识Nacos Nacos 致力于帮助您发现 配置和管理微服务 Nacos 提供了一组简单易用的特性集 帮助您快
  • 【转】介绍线性代数

    color red 这里转一个别人写的对线性代数的理解 觉得他已经写出了线性代数的魂 可惜的是我也是从网上别人的转载中摘录的 未知作者的大名啊 color 今天先谈谈对线形空间和矩阵的几个核心概念的理解 这些东西大部分是凭着自己的理解写出来
  • Canvas画布基本功能及实现网页签名功能

    canvas 简介