【Web2D/3D】Canvas(第三篇)

1. 前言

        <canvas>是HTML5新增元素,它是一个画板,开发人员基于它的2D上下文或webgl上下文,使用JS脚本绘制简单的动画、可交互画面,甚至进行视频渲染。

        本篇介绍基于canvas的2D上下文绘制2D画面的一些方法和属性。

2. canvas元素

        2D坐标系:左上点是坐标原点(0,0),x轴正方向向右,y轴正方向向下,x正方向为弧度0。

        视口viewport:canvas宽高确定视口大小,默认宽高(300px, 150px)。

        canvas元素是HTMLCanvasElement实例化对象,以下列出HTMLCanvasElement原型对象的方法和属性。

方法和属性描述示例

HTMLCanvasElement

.prototype.getContext()

功能:获取一个渲染上下文

输入:‘2d’ | 'webgl' | 'experimental-webgl'

输出:CanvasRenderingContext2D

const canvas = document.getElementById('canvas');

const ctx = canvas.getContext('2d');

HTMLCanvasElement

.prototype.toDataURL()

<略><略>

HTMLCanvasElement

.prototype.toBlob()

<略><略>

HTMLCanvasElement

.prototype.captureStream()

<略><略>

HTMLCanvasElement

.prototype

.transferControlToOffscreen()

<略><略>

HTMLCanvasElement

.prototype.width

功能:设置画布的宽度,默认300px,不建议使用css设置width

<canvas id="canvas" width="500" height="450">

  不支持canvas

</canvas>

HTMLCanvasElement

.prototype.height

功能:设置画布的高度,默认150px,不建议使用css设置height

ctx是CanvasRenderingContext2D的实例化对象,CanvasRenderingContext2D原型对象的方法和属性如下。

方法和属性描述示例
绘制矩形

CanvasRenderingContext2D

.prototype.fillRect(x,y, width, height)

功能:绘制一个填充矩形

输入:

x 矩形左上角x轴坐标

y 矩形左上角y轴坐标

width 矩形宽度

height 矩形高度

ctx.fillStyle = "rgb(200,0,0)";

ctx.fillRect (10, 10, 55, 50);

CanvasRenderingContext2D

.prototype.strokeRect(x,y, width, height)

功能:绘制一个描边矩形

输入:同fillRect的参数

ctx.strokeRect(10, 70, 55, 50);

CanvasRenderingContext2D

.prototype.clearRect(x,y, width, height)

功能:清除指定的矩形区域,清除后这块区域变透明

输入:同fillRect的参数

ctx.clearRect(15, 15, 50, 25);
绘制路径

CanvasRenderingContext2D

.prototype.beginPath()

功能:新建一条路径

输入:无

ctx.beginPath(); ctx.moveTo(50, 50);

ctx.lineTo(200, 50);

ctx.lineTo(200, 200);

ctx.closePath();

ctx.stroke();

// 绘制出一个三角形

ctx.beginPath(); ctx.moveTo(50, 50);

ctx.lineTo(200, 50);

ctx.lineTo(200, 200);

ctx.fill();

// 绘制出一个三角形,并填充黑色

CanvasRenderingContext2D

.prototype.moveTo(x,y)

功能:移动画笔到坐标x,y

输入:

x 位置的x轴坐标

y 位置的y轴坐标

CanvasRenderingContext2D

.prototype.lineTo(x,y)

功能:定义一条从当前位置到目标点x,y的直线

输入:

x 目标点的x轴坐标

y 目标点的y轴坐标

CanvasRenderingContext2D

.prototype.closePath()

功能:闭合路径

CanvasRenderingContext2D

.prototype.stroke()

功能:绘制路径

CanvasRenderingContext2D

.prototype.fill()

功能:填充闭合区域,如果路径未闭合,fill()会自动将路径闭合

CanvasRenderingContext2D

.prototype.arc(x , y, r, startAngle, endAngle, anticlockwise)

功能:绘制圆弧,以x,y为圆心,以r为半径,从startAngle弧度开始到endAngle弧度结束,anticlockwise true表示逆时针,false表示顺时针,默认false

注:弧度0表示x轴正方向

ctx.beginPath();

ctx.arc(150, 50, 40, 0, -Math.PI / 2, true);

ctx.closePath();

ctx.stroke();

ctx.beginPath();

ctx.arc(150, 150, 40, 0, Math.PI, false);

ctx.fill();

CanvasRenderingContext2D

.prototype.arcTo(x1, y1, x2, y2, radius)

功能:绘制圆弧,以x1,y1和x2,y2为控制点,以radius为圆弧半径

注:圆弧与当前点到x1,y1直线,以及x1,y1到x2,y2直线相切

ctx.beginPath(); ctx.moveTo(50, 50); ctx.arcTo(200, 50, 200, 200, 100);

ctx.lineTo(200, 200) ctx.stroke();

CanvasRenderingContext2D

.prototype.quadraticCurveTo(cpx1, cpy1, x, y)

功能:以cpx1,cpy1为控制点,以x,y为终点,绘制二次贝塞尔曲线

ctx.beginPath(); ctx.moveTo(10, 200);

const cpx1=40, cpy1=100;

const x=200, y=200;

ctx.quadraticCurveTo(cpx1, cpy1, x, y);

ctx.stroke();

CanvasRenderingContext2D

.prototype.bezierCurveTo(cpx1,cpy1, cpx2, cpy2, x, y);

功能:以cpx1,cpy1和cpx2,cpy2为控制点,以x,y为终点,绘制三次贝塞尔曲线

ctx.beginPath(); ctx.moveTo(40, 200);

const cpx1=20, cpy1=100;

const cpx2=100, cpy2= 20;

const x=200, y=200; ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); ctx.stroke();

CanvasRenderingContext2D

.prototype.getLineDash()

功能:获取当前虚线样式

输入:无

输出:Array<number>

ctx.setLineDash([20, 5]); ctx.lineDashOffset = 0; ctx.strokeRect(50, 50, 210, 210);

const arr = ctx.getLineDash()

CanvasRenderingContext2D

.prototype.setLineDash(widthArr)

功能:设置线段与间隙长度的交替

输入:Array<number>

CanvasRenderingContext2D

.prototype.lineDashOffset = offset

功能:设置起始偏移量

CanvasRenderingContext2D

.prototype.fillStyle = color

功能:设置图形填充颜色,默认黑色

输入:color 颜色值 | 渐变对象 | 图案对象

ctx.fillStyle = "rgb(200,0,0)";

ctx.fillRect (10, 10, 55, 50);

CanvasRenderingContext2D

.prototype.strokeStyle = color

功能:设置图形描边颜色,默认黑色

输入:color 颜色值 | 渐变对象 | 图案对象

ctx.strokeStyle = "rgb(200,0,0)";

ctx.strokeRect (10, 10, 55, 50);

CanvasRenderingContext2D

.prototype.lineWidth = width

功能:设置线宽度,正值,默认1.0,起点和终点连续中心,上下线宽各占一半

ctx.beginPath();

ctx.moveTo(10, 10);

ctx.lineTo(100, 10);

ctx.lineTo(100, 100);

ctx.lineWidth = 10;

ctx.lineCap = 'round';

ctx.lineJoin = 'miter';

ctx.stroke();

CanvasRenderingContext2D

.prototype.lineCap = type

功能:线条末端样式

输入:butt | round | square

CanvasRenderingContext2D

.prototype.lineJoin = type

功能:同一个path内,设置线条和线条间接合处的样式

输入:round | bevel | miter

绘制文本

CanvasRenderingContext2D

.prototype.fillText(text, x, y, maxWidth?)

功能:在指定位置x,y填充指定文本text,绘制最大宽度可选

ctx.font = "100px sans-serif"; ctx.fillText("热爱技术", 10, 100);

ctx.strokeText("热爱技术", 10, 200)

CanvasRenderingContext2D

.prototype.strokeText(text, x, y, maxWidth?)

功能:在指定位置x,y描边指定文本text,绘制最大宽度可选

CanvasRenderingContext2D

.prototype.font = font

功能:绘制文本的样式,默认'10px sanf-serif'

CanvasRenderingContext2D

.prototype.textAlign = align

功能:文本对齐方式,默认alphabetic

输入:top | hanging | middle | alphabetic | ideographic | bottom

CanvasRenderingContext2D

.prototype.direction = direction

功能:文本方向,默认inherit

输入:ltr | rtl | inherit

绘制图像

CanvasRenderingContext2D

.prototype.drawImage(image, x, y, width?, heigth?)

功能:绘制图片

输入:

image: HTMLImageElement,

x 开始绘制位置的x轴坐标

y 开始绘制位置的y轴坐标

width 绘制的图片宽度

height 绘制的图片高度

注:Image继承于HTMLImageElement

CanvasRenderingContext2D

.prototype.drawImage(image, sx, sy, sWidth, sHeigth, dx, dy, dWidth, dHeigth)

功能:绘制图片

输入:

image: HTMLImageElement,

sx,sy,sWidth,sHeight 从源图像扣图位置和大小

dx,dx,dWidth,dHeight 在canvas目标中显示位置和大小

状态的保存和恢复

CanvasRenderingContext2D

.prototype.save()

功能:将canvas当前状态保存到栈中,入栈

ctx.fillRect(0, 0, 150, 150); ctx.save(); 

ctx.restore();

CanvasRenderingContext2D

.prototype.restore()

功能:将上一次保存的状态从栈弹出,出栈

变换

CanvasRenderingContext2D

.prototype.translate(x,y)

功能:将canvas原点移动到指定位置x,y

输入:

x 目标位置的x轴坐标

y 目标位置的y轴坐标

ctx.save();

ctx.translate(100, 100);

ctx.strokeRect(0, 0, 100, 100) ctx.restore();

ctx.translate(220, 220);

ctx.fillRect(0, 0, 100, 100);

CanvasRenderingContext2D

.prototype.rotate(angle)

功能:将canvas坐标轴顺时针旋转一个角度

ctx.fillStyle = "red";

ctx.save();

ctx.translate(100, 100);

ctx.rotate(Math.PI / 180 * 45);

ctx.fillStyle = "blue";

ctx.fillRect(0, 0, 100, 100);

ctx.restore(); ctx.save();

ctx.translate(0, 0);

ctx.fillRect(0, 0, 50, 50)

ctx.restore();

CanvasRenderingContext2D

.prototype.scale(x,y)

功能:将canvas坐标轴横纵按比例缩放

输入:

x x轴缩放比例

y y轴缩放比例

CanvasRenderingContext2D

.prototype.transform(a,b,c,d,e,f)

a c e

b d f 

0 0 1

功能:变换矩阵

a x轴缩放比例 

b x轴skew

c y轴skew

d y轴缩放比例

e x轴平移量

f y轴平移量

ctx.transform(1, 1, 0, 1, 0, 0);

ctx.fillRect(0, 0, 100, 100);

合成

CanvasRenderingContext2D

.prototype.globalCompositeOperation 

= type

功能:设置图形合成方式,默认不设置,新图像覆盖原图像

输入:

1. soure-in 仅新图像与老图像重叠部分,其它区域透明

2. soure-out 新图像与老图像不重叠部分,老图像不显示

3. source-atop 新图像仅显示与老图像重叠部分,老图像仍显示

4. destination-over 新图像在老图像下面

5. destination-in  仅老图像与新图像重叠部分,其它区域透明

6. destination-out 老图像与新图像不重叠部分,新图像不显示

7. destination-atop: 老图像仅显示重叠部分,新图像在老图像下面

8. lighter 新老图像都显示,相加操作

9. darken 保留重叠部分最黑的像素,位与操作

10. lighten 保留重叠部分,位域操作

11. xor,异或操作

12. copy 仅新图像保留,其它区域透明

<略>
裁剪路径

CanvasRenderingContext2D

.prototype.clip()

功能:将已创建的路径转换成裁剪路径,仅显示裁剪区域,隐藏裁剪路径外的区域

<略>

有兴趣的同学可以参见:学习 HTML5 Canvas 这一篇文章就够了 | 菜鸟教程 (runoob.com)

注:以上,如有不合理之处,还请帮忙指出,大家一起交流学习~  

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

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

相关文章

【leetcode225】用队列实现栈Java代码讲解

12.27 225. 用队列实现栈 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。int pop() 移除…

文件操作安全之-目录穿越流量告警运营分析篇

本文从目录穿越的定义,目录穿越的多种编码流量数据包示例,目录穿越的suricata规则,目录穿越的告警分析研判,目录穿越的处置建议等几个方面阐述如何通过IDS/NDR,态势感知等流量平台的目录穿越类型的告警的线索,开展日常安全运营工作,从而挖掘有意义的安全事件。 目录穿越…

向ES索引里面添加一个字段并更新旧文档数据

问题 最近需要调整ES索引&#xff0c;添加1个字段&#xff0c;并且&#xff0c;对旧文档数据更新新加的字段默认值。 解决思路 通过利用Update mapping API添加1个新字段后&#xff0c;然后&#xff0c;利用Update By Query API将向旧文档数据添加新加字段默认值。 添加字段…

鸿蒙Harmony(八)ArkUI--状态管理器之@State

状态管理 在声明式UI中&#xff0c;是以状态驱动视图更新 状态&#xff1a;指驱动视图更新的数据&#xff08;被装饰器标记的变量&#xff09; StateProp 和 LinkProvide和 Consume State State装饰器标记的变量必须初始化&#xff0c;不能为空值State支持Object 、class、…

ts中的任意接口

interface Persontest {name:string;[key:string]:any } var psss:Persontest{name:1,age:10,sex:男,[Symbol()]:灵境胡同 }ts中&#xff0c;[Symbol()] 是一个计算属性名称的语法&#xff0c;可以在对象字面量中使用 Symbol 类型来动态地生成属性名称&#xff0c;[Symbol()] 生…

【PostgreSQL内核学习(二十)—— 数据库中的遗传算法】

数据库中的遗传算法 概述个体的编码方式及种群初始化geqo 函数 适应值geqo_eval 函数gimme_tree 函数 父体选择策略geqo_selection 函数 杂交算子边重组杂交 ERX ( edge recombination crossover)gimme_edge_table 函数gimme_tour 函数 变异算子geqo_mutation 函数 声明&#x…

Java EE 网络原理之HTTP 响应详解

文章目录 1. 认识"状态码"(status code)2. 通过 form 表单构造 HTTP 请求3. 通过 ajax 构造 HTTP 请求 1. 认识"状态码"(status code) 表示了这次请求对应的响应&#xff0c;是什么样的状态 &#xff08;成功&#xff0c;失败&#xff0c;其他的情况&…

Flask 用户信息编辑系统

Flask 用户信息编辑系统 web/templates/user/edit.html {% extends "common/layout_main.html" %} {% block content %} {% include "common/tab_user.html" %} <div class"row m-t user_edit_wrap"><div class"col-lg-12"…

Java面试题86-95

86. Java代码查错&#xff08;4&#xff09;public class Something { public int addOne(final int x) { return x; }}此代码有错误吗&#xff1f;答案: 错。int x被修饰成final&#xff0c;意味着x不能在addOne method中被修改。87. Java代码查错&#xff08;5&…

Oracle如何自定义数据类型和数组和在数组中使用自定义类型

在Oracle数据库中&#xff0c;你可以自定义数据类型和数组。以下是如何做到这一点的简要指南&#xff1a; 自定义数据类型&#xff1a; 你可以使用CREATE TYPE语句来定义一个新类型。例如&#xff0c;定义一个名为person的类型&#xff0c;它包含两个属性&#xff1a;name和a…

12.Go 函数

1、函数的声明 语法&#xff1a;func 函数名(参数列表)(返回参数列表){函数体} 函数名遵循标识符的命名规则&#xff0c;首字母的大小写决定该函数在其他包的可见性&#xff1a;大写时其他包可见&#xff0c;小写时只有相同的包可以访问&#xff1b;函数的参数和返回值需要使…

GIT提交、回滚等基本操作记录

1、add文件时warning: LF will be replaced by CRLF in .idea/workspace.xml. 原因&#xff1a;windows中的换行符为 CRLF&#xff0c; 而在Linux下的换行符为LF&#xff0c;所以在执行add . 时会出现以下提示 解决&#xff1a;git config core.autocrlf false 2、GIT命令&…

pip 国内镜像源

pip 国内镜像源 部分可用的pip国内镜像源有下面这些&#xff1a; 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣 http://pypi.douban.com/simple Python官方 https://pypi.python.org/simple/ v2ex http://pypi…

HarmonyOS应用开发实战—开箱即用的登录页面3【ArkTS】

文章目录 一.HarmonyOS应用开发实战—开箱即用的登录页面2【ArkTS】【鸿蒙专栏-31】1.1 项目背景1.2 ArkTS详解二.HarmonyOS应用开发实战—开箱即用的登录页面3【ArkTS】2.1 ArkTS页面源码2.2 代码解析2.3 心得一.HarmonyOS应用开发实战—开箱即用的登录页面2【ArkTS】【鸿蒙专…

【微信】公众号授权绑定登录流程详解

在做微信公众号开发时&#xff0c;经常需要对公众号上面的菜单做授权登录&#xff0c;如果是首次登录还需要做微信openId和系统账号的绑定操作。 这里做如下假设&#xff1a; 系统前端地址&#xff1a;http://www.test.com系统接口地址&#xff1a;http://api.test.com需要打…

Activity启动过程

首语 Activity作为Android四大组件中使用最频繁的组件&#xff0c;也是和用户交互最多的组件&#xff0c;可见它在Android技术体系的核心地位&#xff0c;了解Activity的启动过程可以帮助我们更好的了解Android系统和使用Activity。 文章目录 首语Activity启动过程根Activity…

加强->servlet->tomcat

0什么是servlet jsp也是servlet 细细体会 Servlet 是 JavaEE 的规范之一&#xff0c;通俗的来说就是 Java 接口&#xff0c;将来我们可以定义 Java 类来实现这个接口&#xff0c;并由 Web 服务器运行 Servlet &#xff0c;所以 TomCat 又被称作 Servlet 容器。 Servlet 提供了…

打造完备数据生态,「开放互信、合作共赢」: 拓数派亮相2023龙蜥操作系统大会

拓数派始终持「开放互信&#xff0c;合作共赢」的理念&#xff0c;通过积极建立合作伙伴生态网络、构建生态工具、打造活跃的技术和用户社区等方式&#xff0c;构筑更加完善的数据生态体系&#xff0c;为用户带来更加便捷的使用体验。2023年12月17-18日&#xff0c;由开放原子开…

如何实现无公网ip环境访问vscode远程开发【内网穿透】

文章目录 前言1、安装 OpenSSH2、vscode 配置 ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu 安装 cpolar 内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定 TCP 端口地址5.1 保留一个固定 TCP 端口地址5.2 配置固定 TCP 端口地址5.3 测试固定公网地址远…

vue exceljs json数据转excel

json数据转excel 有时候我们会遇到这样一个需求&#xff0c;就是将数据转成excel下载&#xff0c;这一般都是由后端来处理&#xff0c;使用插件poi轻松搞定。如果只有少量数据&#xff0c;那么能不能避免调用后端接口&#xff0c;前端直接处理呢&#xff1f; 答案是&#xff…