Canvas知识点梳理1

简介: Canvas知识点梳理1

一、前言

Canvas是HTML5标准中推出的一个非常受欢迎的功能元素,这个元素负责在页面中设定一个区域,然后就可以JS动态地在这个区域中绘制图形了。并且它还是跨平台动画和游戏的标准方案。

二、前提条件

2.1 初始化

要使用canvas元素必须先设置其width和height属性,指定绘图区域的大小。

如果浏览器不支持该功能,那么将会显示你在canvas标签中键入的文本内容。

<!-- 宽度为400,高度为400的canvas -->
<canvas id="myCvs" width="400" height="400">
    Your browser does not support canvas.
</canvas>

2.2 创建绘图环境

在使用canvas元素之前,必须保证要有一个2d的绘图环境。

if(myCvs.getContext) {
    var context = myCvs.getContext('2d');
}else {
    console.log('Your browser does not support canvas.');
}

使用2d绘图环境提供的方法,可以绘制简单的2d图形,比如矩形、弧线和路径。

它的坐标原点(0, 0)在canvas元素的左上角。

1688211384965.png

2.3 案例

在学习2d绘图方法之前,我们试着看一下canvas的一个简单例子:画一个绿色矩形。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Canvas</title>
<style>
    canvas {
        border: 1px solid #000;
    }
</style>
</head>
<body>
    <!-- 宽度为400,高度为400的canvas -->
    <canvas id="myCvs" width="400" height="400">
        Your browser does not support canvas.
    </canvas>
    <script>
        var myCvs = document.getElementById('myCvs');
        // 检测是否支持2d上下文
        if(myCvs.getContext) {
            var context = myCvs.getContext('2d');
        }else {
            console.log('Your browser does not support canvas.');
        }
        function load() {
            context.fillStyle = '#0f0'; // 填充颜色为绿色
            context.fillRect(50,25,300,150); // 填充矩形 (起点x坐标, 起点y坐标, 宽度, 高度)
        }
        window.onload = function() {
            load();
        }
    </script>
</body>
</html>

1688211403758.png


三、基础使用

canvas在2d上下文环境中提供了一些可供画图的属性和方法,接下来具体看一下。

3.1 描边和填充

描边,就是只在图形的边缘画线;

填充,就是用指定的样式(颜色、渐变或图像)填充图像。

var myCvs = document.getElementById('myCvs');
if(myCvs.getContext) {
    var context = myCvs.getContext('2d');
    context.strokeStyle = 'red'; // 描边
    context.fillStyle = 'green'; // 填充
}

3.2 绘制矩形

矩形是唯一一种可以直接在2d上下文中绘制的形状。

与矩形有关的方法包括fillRect()、strokeRect()和clearRect()。

它们接收4个参数:矩形的x坐标,矩形的y坐标,矩形宽度和矩形高度。单位都是像素。

3.2.1 fillRect() 填充矩形

// 绘制红色矩形
context.fillStyle = 'red'; // 指定填充颜色为红色
context.fillRect(10,10,50,50); // 指定填充矩形的4个参数

1688211436805.png

3.2.2 strokeRect() 描边矩形

// 绘制绿色描边矩形
context.strokeStyle = 'green'; // 指定描边颜色
context.strokeRect(70,10,50,50); // 指定描边矩形的4个参数

1688211451483.png

3.2.3 clearRect() 清除矩形区域

// 清除画布矩形区域
context.clearRect(0,0,400,400);

1688211467242.png


3.3 绘制路径

通过路径可以创造出复杂的形状和线条。

3.3.1 路径方法

  • arc(x, y, radius, startAngle, endAngle, counterclockwise):以(x, y)为圆心绘制一条弧线,弧线半径为radius,起始和结束角度(弧度)分别为 startAngle和endAngle,最后一个参数counterclockwise表示绘制方向是否按照逆时针方向计算,值false表示按顺时针方向计算。
  • arcTo(x1, y1, x2, y2, radius):从上一点开始绘制一条弧线,到(x2,y2)为止,并且以给定半径radius穿过(x1,y1)。
  • bezierCurveTo(c1x, c1y, c2x, c2y, x, y):从上一点开始绘制一条曲线,到(x,y)为止,并且以(c1x,c1y)和(c2x,c2y)为控制点。
  • lineTo(x, y):从上一点开始绘制一条直线,到(x,y)为止。
  • moveTo(x, y):将绘图画笔移动到(x, y),不画图。一般后面就接lineTo()方法。
  • quadraticCurveTo(cx, cy, x, y):从上一点开始绘制一条二次曲线,到(x, y)为止,并且以(cx, cy)作为控制点。
  • rect(x, y, width, height):从点(x, y)开始绘制一个矩形,宽度和高度分别由width和height指定。注意这里画的是矩形路径而不是独立形状。

3.3.2 绘制流程

在绘制路径之前,必须调用beginPath()方法,表示要开始绘制新的路径了。

在创建了新的路径之后,如果想要绘制一条连接到路径起点的线条,那么就调用closePath()方法

如果路径已经完成,想要填充它那么就调用fill()方法,想要描边就调用stroke()方法

3.3.3 案例

画线

// 画线组成矩形
context.beginPath(); // 指定新路径
context.moveTo(10,70); // 画笔移动至(10,70)
context.lineTo(10,120); // 第一点坐标
context.lineTo(60,120); // 第二点坐标
context.lineTo(60,70); // 第三点坐标
context.closePath(); // 闭合路径
context.strokeStyle = 'blue'; // 指定描边颜色
context.stroke(); // 描边

画圆弧

// 画圆弧
context.beginPath();
context.arc(95,95,25,0,2*Math.PI,true); // 圆心(95,95) 起始角度0弧度 结束角度2PI弧度 逆时针方向计算
context.closePath();
context.stroke();

1688211877468.png

三角形

// 三角形
context.beginPath();
context.moveTo(150, 70); // 第一点坐标
context.lineTo(125, 120); // 第二点坐标
context.lineTo(175, 120); // 第三点坐标
context.closePath();
context.fillStyle = 'yellow' // 指定填充颜色
context.fill(); // 填充

贝塞尔曲线

// 二次贝塞尔曲线(1个控制点)
context.beginPath();
context.moveTo(10, 155); // 画笔移动到(10,155)
context.quadraticCurveTo(60, 200, 300, 155); // 控制点坐标(60,200) 结束点坐标(300,155)
context.stroke();
// 三次贝塞尔曲线(2个控制点)
context.beginPath();
context.moveTo(10, 355); // 画笔移动到(10,355)
context.bezierCurveTo(90, 200, 150, 300, 350, 350); // 控制点坐标(90,200)和(150,300) 结束点坐标(350,350)
context.strokeStyle = 'green';
context.stroke();

案例结果如图所示:

1688211941605.png

四、Canvas的图形变换

在Canvas的2d上下文中还支持各种基本的绘制变换。

这里介绍平移、旋转、缩放三种变换在Canvas中的实现。

4.1 保存与恢复

在了解各种变换之前,我们先想一个这样的问题:在用canvas画图时,如果我们频繁使用几个默认值的设定,是否可以重置为默认值而不必重复定义呢?

这时就要用到2d上下文提供的保存和恢复的方法了,即save()和restore()方法,它们是以堆栈**(先进后出)的形式保存绘图上下文的设置和变换**。

这里看个例子,依次保存然后依次恢复读取设置的颜色。

var myCvs = document.getElementById('myCvs');
var ctx = myCvs.getContext('2d');
ctx.strokeStyle = '#f00';
ctx.save(); // 保存指定颜色-红色
ctx.strokeStyle = '#0f0';
ctx.save(); // 保存指定颜色-绿色
ctx.strokeStyle = '#00f';
ctx.save(); // 保存指定颜色-蓝色
ctx.restore(); // 恢复指定颜色-蓝色
ctx.strokeRect(10, 10, 50, 50);
ctx.restore(); // 恢复指定颜色-绿色
ctx.strokeRect(70, 10, 50, 50);
ctx.restore(); // 恢复指定颜色-红色
ctx.strokeRect(130, 10, 50, 50);

1688211959338.png


目录
相关文章
|
监控 调度 开发工具
IO神器blktrace使用介绍
## 前言 1. blktrace的作者正是block io的maintainer,开发此工具,可以更好的追踪IO的过程。 2. blktrace 结合btt可以统计一个IO是在调度队列停留的时间长,还是在硬件上消耗的时间长,利用这个工具可以协助分析和优化问题。 ## blktrace的原理 一个I/O请求的处理过程,可以梳理为这样一张简单的图: ![](http://image
20094 0
|
9月前
|
前端开发 JavaScript Java
JavaScript闭包深入剖析:性能剖析与优化技巧
JavaScript 闭包是强大而灵活的特性,广泛应用于数据封装、函数柯里化和事件处理等场景。闭包通过保存外部作用域的变量,实现了私有变量和方法的创建,提升了代码的安全性和可维护性。然而,闭包也可能带来性能问题,如内存泄漏和执行效率下降。为优化闭包性能,建议采取以下策略:及时解除对不再使用的闭包变量的引用,减少闭包的创建次数,使用 WeakMap 管理弱引用,以及优化闭包结构以减少作用域链查找的开销。在实际开发中,无论是 Web 前端还是 Node.js 后端,这些优化措施都能显著提升程序的性能和稳定性。
226 70
|
9月前
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
201 32
|
JSON JavaScript 前端开发
蓝桥杯web组赛题解析和杯赛技巧
本文作者是一位自学前端两年半的大一学生,在第十五届蓝桥杯Web组比赛中获得省一和国三。文章详细解析了比赛题纲,涵盖HTML、CSS、JavaScript、Echarts和Vue等技术要点,并分享了备赛技巧和比赛经验。作者强调了多写代码和解题思路的重要性,同时提供了省赛和国赛的具体流程及注意事项。希望对参赛者有所帮助。
1024 11
|
SQL 关系型数据库 MySQL
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
484 0
|
缓存 前端开发 UED
前端 8 种图片加载优化方案梳理
本文首发于微信公众号“前端徐徐”,详细探讨了现代网页设计中图片加载速度优化的重要性及方法。内容涵盖图片格式选择(如JPEG、PNG、WebP等)、图片压缩技术、响应式图片、延迟加载、CDN使用、缓存控制、图像裁剪与缩放、Base64编码等前端图片优化策略,旨在帮助开发者提升网页性能和用户体验。
2700 0
|
编解码 算法 Linux
Linux平台下RTSP|RTMP播放器如何跟python交互投递RGB数据供视觉算法分析
在对接Linux平台的RTSP播放模块时,需将播放数据同时提供给Python进行视觉算法分析。技术实现上,可在播放时通过回调函数获取视频帧数据,并以RGB32格式输出。利用`SetVideoFrameCallBackV2`接口设定缩放后的视频帧回调,以满足算法所需的分辨率。回调函数中,每收到一帧数据即保存为bitmap文件。Python端只需读取指定文件夹中的bitmap文件,即可进行视频数据的分析处理。此方案简单有效,但应注意控制输出的bitmap文件数量以避免内存占用过高。
223 3
|
机器学习/深度学习 数据采集 算法
【机器学习7】特征缩放
【机器学习7】特征缩放
334 0
|
缓存 网络协议 Linux
计算机网络 课程大作业:利用Wireshark抓包并进行分析
计算机网络 课程大作业:利用Wireshark抓包并进行分析
996 0
计算机网络 课程大作业:利用Wireshark抓包并进行分析
|
JavaScript Linux 应用服务中间件
部署vue项目到Linux服务器
部署vue项目到Linux服务器
910 1