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

这篇具有很好参考价值的文章主要介绍了【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)

注:以上,如有不合理之处,还请帮忙指出,大家一起交流学习~  文章来源地址https://www.toymoban.com/news/detail-825706.html

到了这里,关于【Web2D/3D】Canvas(第三篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Groovy开发语言系列(第三篇):DSL的强大能力

    欢迎阅读本系列的第三篇文章!在前两篇中,我们已经介绍了Groovy语言的发展历史、特点以及安装和基本语法。今天,我们将聚焦于Groovy的强大能力之一:领域特定语言(Domain-Specific Language,简称DSL)。 让我们先通过一个简单的示例来吸引大家对DSL的兴趣: 这段代码执行后

    2024年02月12日
    浏览(10)
  • 第三篇 香橙派的外设开发基础(中)— 串口篇

    第三篇 香橙派的外设开发基础(中)— 串口篇

    目录 一、OrangePi PC Plus的串口 1.开启OrangePi PC+用于通信的串口  🔖方法一 :修改/boot/orangepiEnv.txt  🔖方法二:通过orangepi-config 2.基于wiringPi的串口通信Demo1.c 二、Linux下的串口开发基础  1.Linux下的串口配置 2.Linux串口通信Demo2.c         根据官方的用户手册所描述,OrangeP

    2023年04月08日
    浏览(11)
  • 2D应用开发是选择WebGL 还是选择Canvas?

    2D应用开发是选择WebGL 还是选择Canvas?

    推荐:使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 在介绍WebGL和Canvas的区别和联系之前,需要先了解它们各自的定义和特点。 WebGL是一种基于标准HTML5的技术,用于在Web浏览器中实时渲染3D图形。它是由Khronos Group开发的一套API(Application Programming Interface),允许

    2024年02月12日
    浏览(10)
  • Web前端 3D开发入门规划 3D效果将不再是桌面应用的专利

    Web前端 3D开发入门规划 3D效果将不再是桌面应用的专利

    随着 WEB领域的快速发展 3D技术开始不再是桌面应用的专利 WEB3D技术的应用 实现了启用网址的3维呈现 让界面更直观 立体的展示 他打破了传统平面的展示形式 那么 目前的话 政府也有大量的新基建的项目 如 数字孪生 智慧城市 智慧园区 智慧工厂 智慧消费等等项目都涉及到了

    2024年02月10日
    浏览(11)
  • 第三篇【传奇开心果系列】Vant开发移动应用:财务管理应用

    第三篇【传奇开心果系列】Vant开发移动应用:财务管理应用

    使用vant实现财务管理应用:创建一个简单的财务管理应用,用户可以记录和跟踪他们的收入和支出,并生成报表和图表展示财务状况。 1. 首先,安装并引入Vant组件库,以便使用Vant提供的丰富组件来构建财务管理应用界面。 创建一个首页,包括收入、支出、报表和图表四个

    2024年01月22日
    浏览(13)
  • c++类开发的第三篇(讲明白友元函数和this指针)

    c++类开发的第三篇(讲明白友元函数和this指针)

    c++实现了 封装 , 数据 和 处理数据的操作(函数) 是分开存储的。 c++中的 非静态数据成员 直接内含在类对象中,就像c语言的struct一样。 成员函数并不会出现在对象中,而是作为类的一部分存储在代码段中,需要通过对象或对象指针进行调用。成员函数可以访问类的所有成员

    2024年02月21日
    浏览(12)
  • AI大模型运维开发探索第三篇:深入浅出运维智能体

    AI大模型运维开发探索第三篇:深入浅出运维智能体

    作者:炯思、玦离 大模型出现伊始,我们就在SREWorks开源社区征集相关的实验案例。 玦离同学提供了面向大数据HDFS集群的智能体案例,非常好地完成了运维诊断的目标。于是基于这一系列的实验和探索,就有了本篇文章。 读者思路: 介绍什么是智能体 基于智能体的运维诊

    2024年04月24日
    浏览(12)
  • LeaferUI - 性能强悍、简洁轻量的 HTML5 Canvas 2D 图形 UI 绘图框架,用于 web 端在线图形设计、图表、白板、数据可视化等场景

    LeaferUI - 性能强悍、简洁轻量的 HTML5 Canvas 2D 图形 UI 绘图框架,用于 web 端在线图形设计、图表、白板、数据可视化等场景

    最近想做一个轻巧的在线画册和海报设计工具,最近发布的 LeaferUI 特别适合这样的场景。 LeaferUI 是什么? Leafer UI 是基于 LeaferJS 开发的一套绚丽多彩的 UI 绘图框架,帮助开发者快速生成图形界面。LeaferJS 是一个基于 HTML5 Canvas 开发的 2D 绘图渲染引擎,在 web 上绘图性能非

    2024年02月13日
    浏览(10)
  • 前端面试:【浏览器与渲染引擎】Web APIs - DOM、XHR、Fetch、Canvas

    嗨,亲爱的读者!当我们在浏览器中浏览网页时,我们常常会与各种Web API打交道。这些API允许我们与网页内容、服务器资源和图形进行交互。本文将深入探讨一些常见的Web API,包括DOM、XHR、Fetch和Canvas,以帮助你了解它们的用途和如何使用它们。 1. DOM(文档对象模型): 用

    2024年02月11日
    浏览(13)
  • WEB:web2

    WEB:web2

    背景知识         代码审计 题目    由上述可知,这段代码定义了一个函数encode,接受一个字符串参数$str,并返回对其进行加密后的结果 加密算法包括: 使用 strrev函数将字符串进行翻转 ; 对翻转后的每个字符,将其ASCII值加1,然后转换为相应的字符 将得到的新字符使用

    2024年02月15日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包