Canvas 画布基本用法详解

Canvas 画布

HTML中的 <canvas> 标签用于动态绘制图形,所有在<canvas>中的画图必须用JavaScript完成。
<canvas>标签是透明的,它是图形的容器,必须使用脚本才能实际绘制图形。

绘制一个简单的矩形

<!-- canvas标签,必须具备id,width,height三个属性 -->
<canvas id="myCanvas" width="200" height="100">浏览器不支持Canvas</canvas>

如果当前浏览器不支持JavaScript和Canvas,会显示出Canvas标签内部的文本。

// 通过getElementById方法,在JS中找到对应的Canvas元素
const canvas = document.getElementById("myCanvas");
// getContext() 是一个内置的HTML对象,它提供了用于绘图的属性和方法
// 这里接收的参数是'2d',说明这个canvas标签用于绘制平面图案,如果想要绘制立体图案,参数改为'webg1'即可
const ctx = canvas.getContext("2d");

通过ctx对象在画布上开始绘图

// 将画布的填充样式设置为红色
// 这里的值可以是颜色,渐变或图案,默认的fillStyle是黑色
ctx.fillStyle="#f00"; 

ctx.fillRect(0,0,150,75)

Canvas 坐标

Canvas画布是一个二维的网格,画布以左上角为原点,所以我们可以把左上角的坐标看做(0,0),和我们习惯使用的平面直角坐标系不同的是,这个二维网格的Y轴的正方向是向下的
上面的代码中,使用了fillRect(0,0,150,75)这个方法,它的操作是,从左上角开始,绘制一个大小为150乘以75像素的矩形。

画线

第一种方式:

这里需要使用下面三个方法:

  • moveTo(x,y) 定义线的起点坐标
  • lineTo(x,y) 定义线的终点坐标
  • stroke() 实际绘制出moveTo()和lineTo()方法定义的线的路径
// 在(0,0)坐标定义起点
ctx.moveTo(0,0);
// 在(200,100)坐标定义终端
ctx.lineTo(200,100);
// 实际绘制
ctx.stroke(); 
第二种方式:

这里需要使用下面四个方法:

  • beginPath() 定义一个新路径
  • moveTo() 定义线的起点坐标
  • lineTo() 定义线的终点坐标
  • stroke() 实际绘制
// 定义一个新路径:
ctx.beginPath();
// 定义起点:
ctx.moveTo(0, 0);
// 定义终点:
ctx.lineTo(200, 100);
// 绘制:
ctx.stroke();
定义线条宽度

lineWidth 属性定义在画布中绘制时要使用的线条宽度。
必须在调用 stroke() 方法之前设置。

ctx.lineWidth = 10;
ctx.stroke();
定义线条样式

strokeStyle 属性定义在画布中绘制时要使用的样式。
必须在调用 stroke() 方法之前设置。

ctx.strokeStyle = "red";
ctx.stroke();
定义线条两头端部的样式

lineCap属性定义线的端部样式(butt、round 或 square),默认为 square(方形)
必须在调用 stroke() 方法之前设置。

ctx.lineCap = "round";
ctx.stroke();

画圆

这里需要使用下面三个方法:

  • beginPath()
  • arc(x, y, r, startAngle, endAngle, true/false)
ctx.beginPath(); // 开始绘制一个路径
ctx.arc(95,50,40,0,2*Math.PI,true); // 使用arc方法定义一个圆
ctx.stroke();

画弧线

弧线的画法和圆的画法及其相识,毕竟弧线是一部分圆

ctx.beginPath();
ctx.arc(100, 50, 50, 0, Math.PI);
ctx.stroke();

上面两段内容中,都用到了arc方法,这个方法有6个参数,下面对这6个参数做一个详细的解释。
arc(x, y, r, start, end, direction)

  • 方法的前两个参数xy,代表当前圆形或者弧线的圆心的在当前Canvas中的坐标,也就是下图中的center
  • 第三个参数r,代表当前圆形或者弧线的半径
  • 第四、五个参数startend,代表路径开始的角度和结束的角度,也就是圆形或者弧线的起始位置和结束位置。这两个参数有个地方需要特别注意,它的角度是用Math.PI(π)表示的,在Canvas中规定,把一个完整的圆分成2PI,其中0PI和2PI都在圆心的正右方,如下图所示,0PI、0.5PI、1PI、1.5PI、2PI等等这些值,在圆上的位置是固定的。
  • 第六的参数是个可选参数,它的值可以true或者false,代表的是从起始位置开始画弧线的方向(false顺时针/true逆时针
    上面的两个部分

画图形

还是前面画线时使用的几个方法,下面使用这几个方法来画一个几何图形

ctx.beginPath();
ctx.moveTo(20,20);
ctx.lineTo(100,20);
ctx.lineTo(175,100);
ctx.lineTo(20,100);
ctx.lineTo(20,20);
ctx.stroke();

在上面的代码中,调用beginPath方法,说明Canvas画布上开始定义一个路径,moveTo方法定义了这个路径的起点,后面四个lineTo方法,在画布上定义了四个坐标点,最后stroke方法将这几个点连起来。

在Canvas中绘制几何图形的时候,一定要注意几个lineTo方法的顺序,并且最后一个lineTo的坐标一般和moveTo的坐标是相同的,这样正好能形成一个闭合的路径。

最终形成了下面的图形:
在这里插入图片描述

画矩形

使用前面画图形的方式,当然也可以画出矩形来,但是Canvas还提供了一个简单的方式来画矩形,那就是rect()方法。
下面使用这个方法来绘制一个150*100的矩形:

ctx.beginPath();
ctx.rect(20, 20, 150, 100);
ctx.stroke();

rect()方法的前两个参数,指的是矩形的左上角x轴和y轴坐标。

Canvas 文本

在Canvas上绘制文本,有几个很重要的属性和方法:

  • font 定义文本的字体属性
  • fillText(text, x, y) 在画布上绘制“填充的”文本
  • strokeText(text, x, y) 在画布上绘制无填充的文本

Canvas 渐变

渐变可以用于填充图形、线条、文本等,有两种不同类型的渐变:

  • createLinearGradient(x,y,x1,y1) 创建线性渐变
  • createRadialGradient(x,y,r,x1,y1,r1) 创建径向/圆形渐变

fillText()

ctx.font = "30px Arial";
ctx.fillText("Hello World", 10, 50);

strokeText()

ctx.font = "30px Arial";
ctx.strokeText("Hello World", 10, 50);
ctx.font = "30px Comic Sans MS";
ctx.fillStyle = "red";
ctx.textAlign = "center";
ctx.fillText("Hello World", canvas.width/2, canvas.height/2);

createLinearGradient()

// 创建渐变
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);

createRadialGradient()

// 创建渐变
const grd = ctx.createRadialGradient(75, 50, 5, 90, 60, 100);
grd.addColorStop(0, "red");
grd.addColorStop(1, "white");

// 用渐变填充
ctx.fillStyle = grd;
ctx.fillRect(10, 10, 150, 80);

Canvas 图形

在Canvas上绘制图形,需要使用drawImage(image, x, y)方法。
其中,image参数,是要在画布上绘制的图形对象,x和y是图形在画布上的起始坐标(左上角)。

<img src="xx.jpg" alt="橘猫" height="300" id="cat">
const img = document.getElementById("cat");
ctx.drawImage(img, 10, 10);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python基于卷积神经网络的车牌识别系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【数据结构与算法】递推

来源&#xff1a;《信息学奥赛一本通》 所谓递推&#xff0c;是指从已知的初始条件出发&#xff0c;依据某种递推关系&#xff0c;逐次推出所要求的各中间结果及最后结果。其中初始条件或是问题本身已经给定&#xff0c;或是通过对问题的分析与化简后确定。 从已知条件出发逐…

jenkins(docker)安装及应用

jenkins Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行&#xff08;这个比较抽象&#xff0c;暂且写上&#xff0c;不做解…

论坛直击|发展新质生产力,高校怎么做?

新质生产力浪潮涌动 三大议题聚焦高校人才培养 今年全国两会的政府工作报告将“大力推进现代化产业体系建设&#xff0c;加快发展新质生产力”列在2024年政府工作任务首位&#xff0c;发展新质生产力的先导是培养拔尖创新人才&#xff0c;高等教育改革必须以立德树人为根本任…

幽灵漏洞进阶版来了

近日&#xff0c;网络安全研究人员披露了针对英特尔系统上 Linux 内核的首个原生 Spectre v2 漏洞&#xff0c;该漏洞是2018 年曝出的严重处理器「幽灵」&#xff08;Spectre&#xff09;漏洞 v2 衍生版本&#xff0c;利用该漏洞可以从内存中读取敏感数据&#xff0c;主要影响英…

Java怎么获取今天最早的时间

今天在实现项目里的一个功能的时候&#xff0c;需要获取今天最早的时间&#xff0c;比如今天是2024-4-15&#xff0c;则今天的开始时间为2024-4-14日24点之后&#xff08;2024-4-15零点&#xff09;的那个时间点。 这篇文章就分享一下博主获取这个时间的方法&#xff1a; 很简…

Python数据可视化库—Bokeh与Altair指南【第161篇—数据可视化】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在数据科学和数据分析领域&#xff0c;数据可视化是一种强大的工具&#xff0c;可以帮助我们…

代码随想录刷题day53|最长公共子序列不相交的线最大子序和

文章目录 day53学习内容一、最长公共子序列1.1、动态规划五部曲1.1.1、 确定dp数组&#xff08;dp table&#xff09;以及下标的含义1.1.2、确定递推公式1.1.3、 dp数组如何初始化1.1.4、确定遍历顺序1.1.5、输出结果 1.2、代码 二、不相交的线2.1、动态规划五部曲2.1.1、 确定…

【Git】Git的安装与常用命令

Git的安装与常用命令 一、Git的安装 &#xff08;一&#xff09;下载 官网下载&#xff1a;https://git-scm.com/downloads 镜像网站&#xff1a;https://registry.npmmirror.com/binary.html?pathgit-for-windows/ &#xff08;二&#xff09;安装 双击安装&#xff0c…

智能客服系统如何高效分配会话的实用指南

面对现在快节奏的商业市场&#xff0c;能否快速地把握住商机成为了企业制胜的关键&#xff0c;所以很多企业都想要一个可以快速响应客户需求的工具来帮助他们实现更高效的转化。如果能够有一个可以智能识别并自动将客户分配给合适客服的系统&#xff0c;来保证每个客户都能享受…

抖音扫码登录

抖音扫码登录&#xff0c;ck可以点赞关注上传视频 主要涉及参数: bd_ticket_guard_client_data bd_ticket_guard_server_data bd_ticket_guard_ree_public_key bd_ticket_crypt_cookie x–secadk–csrf–token req_sign abogus ts_sign ticket {"is_digg":…

从工程师到医疗高管,复旦MBA助我实现职场飞跃 | 校友故事

2月12日&#xff0c;英国《金融时报》&#xff08;FT&#xff09;发布2024年全球MBA项目百强榜单&#xff0c;复旦大学MBA项目位列全球第27位&#xff0c;并在多个分指标上位居全球前列。其中“职业服务”和“ESG与零排放教学”蝉联亚洲第1、“薪酬增长率”全球第2、“职业成长…

“智能医疗新纪元:机器学习在医疗健康领域的创新应用“

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

[docker] 核心知识 - 容器/镜像的管理和操作

[docker] 核心知识 - 容器/镜像的管理和操作 想要查看完整的指令&#xff0c;可以通过 docker --help 列举所有的指令&#xff0c;这里会提到一些比较常用的核心指令 查看容器的状态 这个应该是最常用的指令&#xff0c;语法为 docker ps&#xff0c; ps 为 process status …

java:多线程解决生产者消费者问题

生产者消费者问题 生产者消费者问题&#xff0c;也称有限缓冲问题&#xff0c;是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两种线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Radio Button的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 按钮类控件Radio Button的使用及说明 文章编号&#xff…

【机器学习】机器学习创建算法第6篇:线性回归,学习目标【附代码文档】

机器学习&#xff08;算法篇&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习算法课程定位、目标&#xff0c;K-近邻算法定位,目标,学习目标,1 什么是K-近邻算法,1 Scikit-learn工具介绍,2 K-近邻算法API。K-近邻算法&#xff0c;1.4 …

云服务器降价,阿里腾讯华为京东云优惠价格表整理

现在租一个服务器多少一个月&#xff1f;优惠价格低至3.8元1个月&#xff0c;租用一个月云服务器收费价格表&#xff1a;阿里云和腾讯云2核2G3M服务器优惠价格61元一年&#xff0c;折合一个月5元&#xff0c;京东云轻量云主机5.8元一个月&#xff0c;华为云服务器优惠价格3.8元…

如何落地一个FaaS平台?

简介&#xff1a; 函数即服务&#xff08;FaaS&#xff09;作为云计算 2.0 时代重要的发展方向&#xff0c;能够从工程效率、可靠性、性能、成本等方面给开发者带来巨大的价值&#xff0c;尤其是能够极大地提升研发效率。因此&#xff0c;拥抱FaaS成为开发者关心的重要技术领域…

【Java】maven的生命周期和概念图

maven的生命周期&#xff1a; 在maven中存在三套"生命周期"&#xff0c;每一套生命周期,相互独立,互不影响的,但是中同一套生命周期里,执行后面的命令会自动先执行前面的命令 CleanLifeCycle&#xff1a;清理的生命周期 clean defaultLifeCycle&#xff1a;默认的…