canvas简易使用教程

news2025/1/23 22:28:13

简介:<canvas> </canvas> 是 HTML5 新增的,一个可以使用脚本(通常为 JavaScript) 在其中绘制图像的 HTML 元素。提供了一个通过JavaScript 和 HTML的<canvas>元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑(如照片集)以及实时视频处理等方面。

参考文档: Canvas - Web API 接口参考 | MDN

1. canvas 标签

使用 canvas 需要在 页面中增加 canvas 标签

<canvas id="canvas" width="300" height="300">
    游览器不支持 canvas , 替换成里面的内容。
	其他标签代替 : <img src="url" alt="代替图">
 </canvas>

注意 :

  • canvas 默认 宽:300 , 高 :150 。
  • 最好在标签里显示修改宽高,在CSS表中修改如果比例与默认值不同可能会使绘制的图扭曲
  • 在较老的游览器(IE9之前) , 在 canvas 标签内一个增加不支持 canvas 时显示的内容(如果浏览器支持canvas标签, 则标签体内容不显示, 只有在浏览器不支持canvas标签时才会显示里面的内容)
  • 结束标签不可省略

2. 渲染上下文

canvas 会创建一个大小固定的画布 ,会公开一个或多个渲染上下文(Rending Context)(可以理解是一个画笔)

使用渲染上下文可以对画步进行操作

获取渲染上下文

通过canvas节点的 getContext方法获取渲染上下文

需传入一个参数 , 2d 或 webgl 等 ,这里只介绍 2d(描绘2d 图像)

const canvas = document.querySelector('#myCanvas');
if (!canvas?.getContext){
    console.log('不支持getContext');
    return;
}
ctx = canvas.getContext('2d');  // 这里的ctx指代的就是canvas渲染上下文

tips: 因为有的游览器不支持 getContext 方法,使用前可以先检查一下

3. 使用渲染上下文(主要)

渲染上下文可以画图进行填充 fill(),也可以画图后描边 stroke()

渲染上下文不设置时默认颜色是黑色 。

3.1 设置颜色

设置颜色分为设置填充颜色 (fillStyle()) 和 描边颜色 (strokeStyle() )。

每次对图形上色时 ,都会选择当前渲染上下文设置的颜色进行上色 ,如果没有默认黑色。

而颜色值可以使用 rgb , rbga , 颜色名称(如 red ) , 十六进制颜色码(#ff0000) …

//  设置填充颜色 , 用于填充图像
ctx.fillStyle = "rgba(0,0,0,0.2)";
//  设置边框颜色 , 用与描绘边框时填充边框
ctx.strokeStyle = 'green'
// ctx.strokeStyle = '#ace'

设置了颜色后 ,有两种方法使用颜色:

1. 是创建图片后自动的立即的上色。(常用)
ctx.fillRect(x,y,width,height) : 在 左上角为(x,y) 的四边形填色。

ctx.strokeRect(x,y,width,height) : 在 左上角为(x,y) 的四边形描边。

2. 是先创建图形,然后再上色
ctx.rect(20,20,30,30) ; ctx.fill() : 先描绘了一个四边形 , 再调用 fill() 方法填色

ctx.rect(20,20,30,30) ; ctx.stroke() : 先描绘了一个四边形 , 再调用 fill() 方法描边

3.2 描绘图形 

 1.绘制矩形

x,y 是相对画步的左上角的坐标, width宽/height高
1). rect(x,y,width,height) :创建一个矩形(不可见),需使用 fill/stroke 进行上色(如上方式2)

2). fillRect(x, y, width, height) :绘制一个填充的矩形。

3). strokeRect(x, y, width, height) :绘制一个矩形的边框。

4). clearRect(x, y, widh, height) :清除指定的矩形区域,然后这块区域会变的完全透明

2. 绘制路径 (path)  即画线, 一般分4或5步

1). 创建路径   ctx.beginPath         (必要) 

2). 设置起点  ctx.moveTo(x,y)        (必要)

3). ctx.lineTo(x,y) : 从起点到 x,y, 画直线           (必要)

4). ctx.closePath() : 会将最后的终于与起点连接起来, 闭合路径   (非必要)

5). ctx.fill() / ctx.stroke() : 填色或描边          (必要)

如果是填色 , 那么是将终点和起点连起来形成的闭合图形进行填色。

如果是描边 ,则只描绘实际有的边,即如果没有闭合路径的话,终点与起点之间就没有线,也就不会描边

3 绘制圆弧

有两个方法可以绘制圆弧:  

1.  arc(x,y,r,starAngle,endAngle,direction)

x ,y 表示圆形 , r 表示半径

starAngle 表示起始弧度(单位 rad) , endAngle 表示结束弧度。

direction(布尔值) : 表示描绘的方向 , true 为 逆时针 , false 为顺时针(默认)

**注意点 : **

度数都为弧度制 ,使用 Math.PI 的倍数表示
0弧度表示 X 轴的正方向
蓝色 :ctx.arc(10,10,10,0,Math.PI/2,true)

红色 : ctx.arc(10,10,10,0,Math.PI/2 ,false)
 

 

2. 通过绘制路径绘制弧  arcTo(a,b,c,d,e)

a ,b:控制点坐标 1

c , d : 控制点坐标 2

e : 弧半径

弧由 控制点1与起点 和 控制点1与控制点2 两切线决定,但是起点和控制点2 不一定是切点

 

4. 绘制贝塞尔曲线

ctx.quadraticCurveTo(): 添加一个 2 次贝赛尔曲线路径。

ctx.bezierCurveTo(): 添加一个 3 次贝赛尔曲线路径。该方法需要三个点。 第一、第二个点是控制点,第三个点是结束点。起始点是当前路径的最后一个点,绘制贝赛尔曲线前,可以通过调用 moveTo() 进行修改。(详细可参考MDN)

5 . 绘制文本

使用 fillText( “文本” , x,y,[maxWidth]) 绘制文本 ,使用 stroke 即绘制文本的边 

文本样式 :

ctx.font = value : 设置文本样式 ,如CSS设置一样 , 默认 10px sans-serif
ctx.textAlign = value : 文本对齐选项。 可选的值包括:start, end, left, right or center。 默认值是 start。
ctx.textBaseline = value : 文本方向。可能的值包括:ltr, rtl, inherit。默认值是 inherit。

//文字对齐方式 start、end、center、left、right(选填)
ctx.textAlign = 'start';
//设置字体和尺寸 (必填)
ctx.font = '400 12px PingFangSC-Regular';  // 第一项类似于font-weight,可以设置为bold/normal等
//填充文字 x-横坐标 y-纵坐标 (必填)
ctx.fillStyle = 'rgba(0,0,0,0.85)';
ctx.fillText('hello canvas', 32, 50);

6. 绘制图片

ctx.drawImage(img,0,w,h) ,将图片对象绘制到目的坐标位置 

注意: 如果图片是从网络加载 ,最好等 img.onload 后再绘制

第 1 个参数是 : 要绘制的图片源,可是是图片,也可以是 canvas 节点

第 2 和 3 个参数 : 目标位置的左上角 。最后绘制出的图片的左上角就是该点。

第 4 和 5 参数数 ,分别是 width ,height 。控制图片大小。

7 .切片

drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) 

参数 1 :图片源 , 也可以是一个 canvas ,

​ 2,3 : 图片源上的一点 ,为切割图的左上角

​ 4,5 :宽高 , 切图大小

6,7 : 绘制图的起点(左上角点)

8,9 : 绘制图的宽高

4. 样式设置

全局透明

ctx.globalAlpha = transparencyValue 

transparencyValue的值为 0-1 , 0 为完全透明 , 1为完全不透明

设置后不会影响之前已经画号的 , 会影响之后的 。即使 后面使用了 raba(0,0,0,1)

图线样式

  • ctx.lineWidth : 线宽 (可无单位,默认px) 
  • ctx.lineCap : 线帽(也叫线端)

       有 butt 直接切断 , round 圆顶 , square 增加一个方块

  • ctx.lineJoin : 线段之间连线的方法

       round 通过填充一个额外的,圆心在相连部分末端的扇形,绘制拐角的形状。 圆角的半径是线段的宽度。
bevel 在相连部分的末端填充一个额外的以三角形为底的区域, 每个部分都有各自独立的矩形拐角。
miter(默认) 通过延伸相连部分的外边缘,使其相交于一点,形成一个额外的菱形区域。

  • ctx.setLineDash(实线长度,间隙) :设置成虚线

  • ctx.lineDashOffset : 虚线起始偏移量

5. 获取 Canvas 为图片

canvas.toDataURL()

 let img = document.querySelector('img');
let imgdata = canvas.toDataURL('image/png');
 let newdata = imgdata.replace(/^data:image\/png/, 'data:image/jpeg'); (看情况使用)
 img.src = newdata;

6.实例

实例1: 绘制直角

ctx.beginPath();
ctx.moveTo(0,0);
ctx.lineTo(0,50);
ctx.lineTo(80,50);
ctx.rotate(0.5 * Math.PI);
ctx.stroke();

实例2: 绘制圆角矩形

ctx.beginPath();
ctx.arc(150, 150, 50, 0, 0.5 * Math.PI, false);
ctx.moveTo(150,200);
ctx.lineTo(50,200);
ctx.arc(50, 150,50,0.5 * Math.PI,1 * Math.PI, false);
ctx.moveTo(0,150);
ctx.lineTo(0,50);
ctx.arc(50, 50,50,1 * Math.PI,1.5 * Math.PI, false);
ctx.moveTo(50,0);
ctx.lineTo(150,0);
ctx.arc(150, 50,50,1.5 * Math.PI,2 * Math.PI, false);
ctx.moveTo(200,50);
ctx.lineTo(200,150);
ctx.stroke();

效果:

 参考:https://blog.csdn.net/NiHoAjy/article/details/119682331

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

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

相关文章

FilterChain(过滤器链)详解

在一个 Web 应用程序中可以注册多个 Filter 程序&#xff0c;每个 Filter 程序都可以针对某一个 URL 进行拦截。如果多个 Filter 程序都对同一个 URL 进行拦截&#xff0c;那么这些 Filter 就会组成一个Filter 链&#xff08;也称过滤器链&#xff09;。 Filter 链用 FilterCh…

vue获取文件流(视频流、音频流、图片流)数据并将其回显展示

前言 这几天深受数据回显的折磨&#xff0c;级联选择器的回显还没想出怎么弄&#xff0c;又碰到了文件流的回显&#xff0c;主要第一次接触&#xff0c;看着一堆乱码&#xff0c;连是什么问题都不懂&#xff0c;后面通过查阅一天的资料&#xff0c;总结了一下方法&#xff0c;…

Axure教程-新手入门基础(小白强烈推荐!!!)

Axure教程-新手入门基础(小白推荐) 1.Axure软件介绍 Axure RP是一款专业的快速原型设计工具。Axure&#xff08;发音&#xff1a;Ack-sure&#xff09;&#xff0c;代表美国Axure公司&#xff1b;RP则是Rapid Prototyping&#xff08;快速原型&#xff09;的缩写。 Axure RP的…

Code For Better 谷歌开发者之声——使用谷歌浏览器 Chrome 更好地调试

&#x1f482; 个人网站:【 海拥】【小霸王游戏机】&#x1f91f; 风趣幽默的前端学习课程&#xff1a;&#x1f449;28个案例趣学前端&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】&#x1f4ac; 免费且实用的计算机相关知识题库&…

layui最新版本更新已全面拥抱Vue3,layui - vue是一套Vue 3.0的桌面端组件库,提供100%的layui的体验;

layui - vue目前的版本是1.4.9&#xff0c;目前常用的大部分组件已全部覆盖&#xff0c;最惊喜的地方在动画和过度组件做的比较好&#xff0c;应该是目前Vue组件库里面做的比较好的&#xff0c;Vue的动画相比于React和Angular一直比较弱,layui - vue目前做的不错&#xff0c;目…

前端中的BFC是什么?

BFC的概念 BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域&#xff0c;只有Block-level box参与&#xff0c; 它规定了内部的Block-level Box如何布局&#xff0c;并且与这个区域外部毫不相干。 MDN给出的解释是&#xff1a;BFC是…

【docker基础操作命令】(一)启动命令和镜像命令

文章目录docker启动命令1. 启动docker2. 关闭docker3. 重启docker4. 查看docker运行状态5. 设置docker开机自启动6. 查看docker信息7. 查看docker的帮助文档docker镜像命令1. 显示当前docker下的所有镜像2. 从远程仓库查看指定名称的镜像3. 下载镜像到本地4. 查看镜像/容器/数据…

分布式ELK日志监控系统环境搭建

文章目录1.1为什么需要监控项目日志1.2ELK日志监控系统介绍1.3ELK的工作流程1.4ELK环境搭建1.4.1Elasticsearch的安装1.4.2Kibana的安装1.4.3Logstash的安装1.4.4数据源配置1.4.5日志监测测试1.1为什么需要监控项目日志 项目日志是记录项目运行过程中产生的事件和信息的重要工…

web前端开发和后端开发哪个难度大?

前言 因为涉及到的具体的应用的领域不同&#xff0c;所以说不能简单地说哪一个难&#xff0c;对于前端而言你会感觉到入门会非常的简单&#xff0c;这也是会给许多人一种错觉&#xff0c;前端很简单&#xff0c;但是只能说是在入门理解上是有利于新手的&#xff0c;前端在主要…

Python tkinter(GUI编程)模块最完整教程(上)

提示&#xff1a;下滑文章左侧可以查看目录&#xff01; 1 走进tkinter世界 1.1 认识tkinter tkinter是一个GUI开发模块&#xff0c;是Tcl/Tk语言在Python上的接口&#xff0c;可以在大部分操作系统上运行。tkinter非常的简单而且好用。tkinter模块是自带的Python模块&#…

vue3.2 基础及常用方法

Vue3.2(21年8月10日)相比于Vue3新增了语法糖,减少了代码冗余 Vue3相比于Vue2,在虚拟DOM,编译, 数据代理,打包构建封面进行了优化 Vue3使用组合式API, 适合大型项目, 去除了this vue2的 beforeCreate 和 created 被新增的setup生命周期替代 vue3 使用插件: volar 配置用户代…

js中常遇到 切割截取字符串的几种方法

切割截取字符串的几种方法 1、 split() 方法用于把一个 字符串 分割成 字符串数组 &#xff1b; stringObject.split(str,length)var str "123,456,789"; console.log(str.split()); // ["1", "2", "3", ",", "4&qu…

【PC端聊天功能模板】vue-elementul简单实现电脑端客服聊天功能,pc端聊天系统静态页面布局,配套websocket方案和心跳重连机制【详细注释,拿来即用】

前言 这里是给大家写了一个简单的模板来使用&#xff0c;可以直接复制了调调就能用。因为这个聊天也是很容易出现的功能&#xff0c;所以我写一个模板静态页面放在这&#xff0c;以后需要这个功能的时候可以不用布局了&#xff0c;直接复制改改。 我的代码里面有详细的注释&…

小马带你认识前端开发神器WebStorm(WebStorm及Git的相关配置与使用)

先说一下个人感觉吧&#xff0c;小马之前也是一直在用 Visual Studio Code 来进行开发&#xff0c;但随着开发需求增加&#xff0c;VS 所需要的插件越来越多&#xff08;用过 vs code 的同学都知道&#xff0c;它虽可以进行各种开发语言的编写&#xff0c;但是需要相应的插件支…

ECharts设置x轴刻度间隔的两种方法

ECharts设置x轴刻度文字间隔的两种方法 背景 最近在写一个echarts数据看板&#xff0c;要在一个页面中展示多张图表&#xff0c;所以留给每张图表的尺寸就很小。这也就使得图表x轴的刻度文字全部挤到一起了&#xff0c;废话不多说&#xff0c;直接上图看效果。 右边的图标就…

11.定时任务定时线程池详解

3.1 新增定时任务池 11.定时任务&定时线程池详解 ​ 当我们不用任务框架时&#xff0c;我们想自己写一个定时任务时&#xff0c;我们能想起那个工具类呢&#xff1f;Timer &#xff1f;还有吗&#xff1f;不知道了&#xff0c;下面我们要讲下ScheduledThreadPoolExecutor…

Vue图片路径问题(动态引入:绝对路径、相对路径),require动态路径问题

Vue图片路径问题&#xff08;动/静态引入&#xff1a;绝对路径、相对路径&#xff09; DEMO实例&#xff08;可快速解决问题&#xff09;: 注意&#xff1a;绝对路径方式导入的图片需要存储在 publiic 文件夹下 静态导入相对路径&#xff1a; <img src"../../asset…

Mybatis+Servlet+Mysql 整合的一个小项目:对初学者非常友好,有助于初学者很快的上手Java Web

文章目录前言为何要写&#xff1f;目录结构1 依赖配置1.1 创建一个web项目1.2 依赖需求分析1.3 pom.xml2 配置Mybatis2.1 mybatis-config.xml2.2 UserMapper.xml2.3 UserMapper.interface3 配置Tomcat4 Servlet类4.1 loginServlet014.2 registerRequest015 静态页面代码5.1 Htm…

Vue开发实例(13)之axios和mockjs的安装与使用

作者简介 作者名&#xff1a;编程界明世隐 简介&#xff1a;CSDN博客专家&#xff0c;从事软件开发多年&#xff0c;精通Java、JavaScript&#xff0c;博主也是从零开始一步步把学习成长、深知学习和积累的重要性&#xff0c;喜欢跟广大ADC一起打野升级&#xff0c;欢迎您关注&…

Vue3中 内置组件 Teleport 详解

1. 基本概念 1.1 简单理解 不管是 Vue2 还是 Vue3 中都有内置组件的存在&#xff0c;如 component 内置组件、transition 内置组件等等。内置组件就是官方给我们封装的全局组件&#xff0c;我们直接拿来用就可以了。 在 Vue3 中新增了 Teleport 内置组件&#xff0c;先来看下…