Canvas保姆级教程----深入解析HTML5 Canvas工作原理和常用方法

📢 鸿蒙专栏:想学鸿蒙的,冲

📢 C语言专栏:想学C语言的,冲

📢 VUE专栏:想学VUE的,冲这里

📢 CSS专栏:想学CSS的,冲这里

📢 Krpano专栏:想学VUE的,冲这里

🔔 上述专栏,都在不定期持续更新中!!!!!!!!!!!!!

目录

✨ 前言

一、Canvas工作原理

1、获取Canvas元素

2、获取渲染上下文

3、绘图方法

4、渲染动画

二、坐标系统

三、常用绘图方法

1、绘制矩形

2、绘制路径

3、绘制圆弧 arc()

4、绘制图像 drawImage()

5、变形

6、样式设置

7、渐变和图片填充

 四、Canvas案例:

1、复杂路径绘制

2、保存和恢复状态

3、剪切区域 clip()

4、图像像素操作

5、动画效果

✨ 结语


 

✨ 前言

        HTML5 Canvas让网页具备了强大的绘图能力,我们可以通过JavaScript动态生成各种图表、动画等复杂的可视化效果。要合理利用Canvas开发丰富的组件和页面,理解它的工作原理是必要的。本文将详细解析Canvas的实现过程,并给出各种常用绘图方法的代码示例,希望可以帮助开发者全面掌握Canvas。

一、Canvas工作原理

1、获取Canvas元素

使用document.getElementById()获取HTML页面中的<canvas>元素,例如:

const canvas = document.getElementById('myCanvas')
2、获取渲染上下文

通过canvas.getContext()获取绘图上下文,通常我们使用2d上下文:

const ctx = canvas.getContext('2d')
3、绘图方法

通过上下文提供的API绘制图形,诸如rect、arc等。

ctx.rect(20, 20, 150, 100)
4、渲染动画

Canvas会记录绘图命令,并在需要时重绘整个scen来实现动画效果。

二、坐标系统

Canvas使用一个笛卡尔坐标系统,原点在左上角,x轴向右为正,y轴向下为正,单位默认为px。

三、常用绘图方法

1、绘制矩形
  • fillRect(x, y, width, height) 填充矩形
  • strokeRect(x, y, width, height) 绘制矩形边框
    // 绘制一个蓝色矩形
    ctx.fillStyle = 'blue' 
    ctx.fillRect(20, 20, 150, 100)// 绘制一个矩形边框 
    ctx.strokeStyle = 'red'
    ctx.strokeRect(20, 20, 150, 100)

2、绘制路径
  • 使用beginPath()起始一条路径,各种绘图命令添加子路径,closePath()闭合路径。

    ctx.beginPath()
    ctx.moveTo(20, 20)
    ctx.lineTo(200, 20)
    ctx.lineTo(200, 100)
    ctx.closePath()
    ctx.stroke()

3、绘制圆弧 arc()

arc(x, y, radius, startAngle, endAngle, anticlockwise)

ctx.beginPath()
ctx.arc(100, 75, 50, 0, 2 * Math.PI) 
ctx.fillStyle = 'red'
ctx.fill()
4、绘制图像 drawImage()
// 绘制图像
const img = new Image() 
img.src = 'image.png'
img.onload = function() {ctx.drawImage(img, 0, 0) 
}// 缩放绘制
ctx.drawImage(img, 0, 0, width, height) // 剪切绘制
ctx.drawImage(img, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
5、变形
  • translate(x, y) 坐标系平移
  • rotate(angle) 旋转坐标系
  • scale(x, y) 坐标系缩放
  • transform(a, b, c, d, e, f) 变形矩阵
// 平移坐标系原点到(50, 50)
ctx.translate(50, 50)// 以(50, 50)为中心旋转30度
ctx.rotate(30 * Math.PI/180) // 缩放坐标系
ctx.scale(0.5, 0.5)
6、样式设置
  • fillStyle 填充样式
  • strokeStyle 线条样式
  • lineWidth 线宽
  • lineCap 线端样式
ctx.fillStyle = 'rgba(255, 0, 0, 0.3)' ctx.lineWidth = 5
ctx.strokeStyle = '#333'
7、渐变和图片填充
  • createLinearGradient() 线性渐变
  • createRadialGradient() 径向渐变
  • createPattern() 填充画布图案
// 创建一个线性渐变
const grd = ctx.createLinearGradient(0, 0, 200, 0)
grd.addColorStop(0, 'red') 
grd.addColorStop(1, 'white')// 填充渐变
ctx.fillStyle = grd 
ctx.fillRect(10, 10, 150, 80)

 四、Canvas案例:

1、复杂路径绘制

我们可以通过多次调用lineTo()和曲线绘制方法来创建复杂路径:

ctx.beginPath()ctx.moveTo(50, 50)
ctx.lineTo(100, 75) 
ctx.quadraticCurveTo(100, 25, 150, 50)
ctx.lineTo(150, 150)ctx.closePath()
ctx.fill()
2、保存和恢复状态

save() 和 restore() 可以保存和恢复Canvas的状态: 

// 保存当前状态
ctx.save()  // 移动坐标系原点
ctx.translate(100, 100)// 绘制路径
ctx.beginPath()
//...// 恢复到保存的状态
ctx.restore()
3、剪切区域 clip()

我们可以剪切出某个形状的区域:

// 剪切矩形区域
ctx.rect(50, 50, 100, 100)
ctx.clip()// 后续的绘制都会被剪切
ctx.beginPath()  
// ...
4、图像像素操作

getImageData() 和 putImageData() 可以直接读写像素信息。

5、动画效果

通过循环调用绘制方法,并清除上一帧可以创建动画。

function draw(){ctx.clearRect(0, 0, canvas.width, canvas.height)//绘制当前帧动画requestAnimationFrame(draw)
}

✨ 结语

        通过详细解析Canvas的原理及各种绘图方法的代码示例,相信大家对Canvas的运作和使用会有更深入的理解。Canvas为前端开发提供了强大的能力,希望本文可以帮助大家高效开发丰富的网页组件和图形效果。

        我们改日再会

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

simulink代码生成(十)——eQEP模块

1 光电编码器的测速原理 光电编码器是一种通过光学或者光电子传感器来检测物体位置、速度或者运动方向的装置。它的测速原理基于光电效应和编码技术&#xff0c;通常包含一个光源、光电传感器和旋转或移动的编码盘。 光源&#xff1a; 光电编码器中通常包含一个光源&#xff0…

用户输入分数, 根据分数奖励不同的车( 利用多分支语句 )

90~100 分 奖励法拉利 80~90 分 奖励奥迪 60~80 分 奖励奥拓 60 分以下 打一顿 <script>const numprompt(请输入一个分数)if(num>90){alert(恭喜你喜提法拉利)}else if(num>80){alert(恭喜你喜提奥迪)}else if(num>60){alert(奖励奥拓)}else{alert(打一顿…

一步到位:掌握Python中Lambda表达式的5种实用技巧

一步到位&#xff1a;掌握Python中Lambda表达式的5种实用技巧 引言技巧一&#xff1a;单行函数定义技巧二&#xff1a;与内置函数结合技巧三&#xff1a;在数据结构排序中的应用技巧四&#xff1a;作为回调函数技巧五&#xff1a;与函数式编程结合结语 引言 在Python编程的宇宙…

QT上位机开发(简易图像处理软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大家都知道图像处理非常地重要&#xff0c;因为它不仅仅是可以用于拍照美颜&#xff0c;而且在工业、医疗和军事等方面也发挥着巨大的作用。另外一…

文件摆渡系统如何实现网络隔离后的数据交换、业务流转?

近年来全球网络安全威胁态势的加速严峻&#xff0c;使得企业对于网络安全有了前所未有的关注高度。即便没有行业性的强制要求&#xff0c;但在严峻的安全态势之下&#xff0c;企业的网络安全体系建设正从“以合规为导向”转变到“以风险为导向”&#xff0c;从原来的“保护安全…

mybatis自动生成代码

以下为真实案例&#xff1a;mybatis自动生成代码 首选准备环境&#xff1a; 开发工具&#xff1a;idea(版本任意) 开发环境&#xff1a;jdk1.8、tomcat8.5、maven3.5 数据库&#xff1a;mysql5.7 数据库驱动&#xff1a;mysql-connector-5.1 方法一&#xff1a;idea搭建环…

贪吃蛇C语言实现(有源码)

前言 之前学了一点easyx图形库的使用&#xff0c;掌握一些基本用法后就用贪吃蛇来进行实战了&#xff0c;运行视频放在csdn视频那一栏了&#xff0c;之前的烟花也是。 1.头文件 #define _CRT_SECURE_NO_WARNINGS 1 #include<easyx.h> #include<conio.h> #includ…

【论文阅读|冷冻电镜】DISCA: High-throughput cryo-ET structural pattern mining

论文题目 High-throughput cryo-ET structural pattern mining by unsupervised deep iterative subtomogram clustering 摘要 现有的结构排序算法的吞吐量低&#xff0c;或者由于依赖于可用模板和手动标签而固有地受到限制。本文提出了一种高吞吐量的、无需模板和标签的深度…

Apache HTTPD 多后缀解析漏洞详解

Apache HTTPD 多后缀解析漏洞 1.查看python版本 这里python版本很重要&#xff0c;因为版本过低可能会导致后面的结果运行不成功 这里我就遇到了因为版本过低而执行不了docker-compose up -d的情况 查看python版本 cd /usr/bin ls -al python* 当版本过低时安装高版本的 …

AI:106-基于卷积神经网络的遥感图像地物分类

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

9. C++ GDB调试原理(简洁版)

背景 GDB支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。 断点 断点是我们在调试中经常用的一个功能&#xff0c;我们在指定位置设置断点之后&#xff0c;程序运行到该位置将会暂停&#xff0c;这个时候我们就可以对程序进行更多的操作&#xff…

IM即时通讯聊天社交APP源码+h5群聊+红包转账+朋友圈

支持文字、表情、图片、语音、单聊、群聊、已读未读、消息群发、内嵌外链、签到、等完备的 IM 功能。 单聊:快速实现私信单聊,具备图片、语音、动态表情、小视频、红包、通话等各种通信能力,消息历史记录支持漫游。 群聊:快速实现群组聊天,单人禁言、全员禁言、群红包、…