JavaScript全解析——canvas 绘制变换和渐变

news2025/1/10 3:01:57

绘制变换
●在 cancas 内, 也可以向 css 中一样, 出现一些 2d 变换的效果
●先来绘制一个基本矩形

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 绘制一个填充矩形
ctx.fillRect(100, 100, 200, 100)


复制代码

绘制位移
●可以将你要绘制的内容进行位移操作
●语法 : 工具箱.transform( x 方向位移尺寸, y 方向位移尺寸 )
●注意 : 一定要先设置位置在进行填充或者描边的操作

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 进行位移设置
ctx.translate(50, 50)

// 3. 绘制一个填充矩形
ctx.fillRect(100, 100, 200, 100)


复制代码

绘制缩放
●可以将你要绘制的图形进行缩放操作
●语法 : 工具箱.scale( x 轴方向缩放, y 轴方向缩放 )
●注意 : 一定要先设置缩放在进行填充或者描边的操作
●注意 : canvas 的缩放不仅仅是对内容的缩放, 更是对画布的缩放

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 进行位移设置
ctx.scale(2, 2)

// 3. 绘制一个填充矩形
ctx.fillRect(100, 100, 200, 100)


复制代码

●我们会发现他已经出界了
因为我们原先预设的 100 100 的坐标位置开始
这个画布放大了, 那么就相当于在 200 200 的位置开始了这个矩形
我们预设的 200 * 100 的矩形
变成了 400 * 200 的矩形

绘制旋转
●可以将你要绘制的内容进行旋转操作
●语法 : 工具箱.rotate( 旋转的弧度 )
●注意 : 一定要先设置缩放在进行填充或者描边的操作
●注意 : canvas 中的旋转中心点只能是画布的左上角, 相当于是在旋转画布

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 进行旋转, 因为是弧度, 换算以后是 30deg 角度
ctx.rotate(Math.PI / 180 * 30)

// 3. 绘制一个填充矩形
ctx.fillStyle = '#000'
ctx.fillRect(100, 100, 200, 100)


复制代码

●可能不太好看的出来是如何计算的 30deg
●看看下面这个例子

●这样可能就更明确了一些

绘制渐变
●canvas 中也是可以绘制渐变颜色的
●而且相对比较简单, 我们只需要制定好渐变方案即可

线性渐变
●要完成一个线性渐变
○要现制定一个渐变方案
○向渐变方案内填充颜色
●然后我们在填充或者描边的时候, 使用这个渐变方案即可
●指定渐变方案
○语法 : 工具箱.createLinearGranient(起点x坐标, 起点y坐标, 终点x坐标, 终点y坐标)

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 制定渐变方案
// 2-1. 生成一个渐变方案
const linearGradient = ctx.createLinearGradient(100, 100, 500, 200)


复制代码

○注意 : 这个坐标位置都是以画布原点开始计算的
○这时是看不到渐变颜色的, 因为我们还没有添加渐变颜色

○根据我们上面的预设, 这个红框圈出来的位置才是真实的完整渐变
○超出红框的位置会自动填充
■左侧超出的全部是开始渐变的颜色
■右侧超出的全部是结束渐变的颜色
■上下超出的按照渐变方向进行统一调整
●接下来我们来给这个渐变方案添加一些渐变的颜色
○语法 : 渐变方案.addColorStop( 位置, 颜色 )

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 制定渐变方案
// 2-1. 生成一个渐变方案
const linearGradient = ctx.createLinearGradient(100, 100, 500, 200)
// 2-2. 添加渐变颜色
linearGradient.addColorStop(0, 'red')
linearGradient.addColorStop(1, 'orange')


复制代码

○这里的位置关系是从 0 到 1, 0 表示指定范围开始坐标, 1 表示指定范围结束坐标
○咱们就从红色渐变过渡到橘黄色

○目前我们的渐变颜色还是没有出现在画布上, 这个是我模拟的形式
○其实只有我们确定的, 100 100 到 500 200 的位置( 黑框圈出来 )是一个完整渐变
○超出的位置都是由 canvas 自动判断填充的颜色
●现在, 这个渐变方案就完成了
●剩下的就是使用这个渐变方案了
●直接把渐变方案设置给 fillStyle 或者 strokeStyle 就可以了

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 制定渐变方案
// 2-1. 生成一个渐变方案
const linearGradient = ctx.createLinearGradient(100, 100, 500, 200)
// 2-2. 添加渐变颜色
linearGradient.addColorStop(0, 'red')
linearGradient.addColorStop(1, 'orange')

// 3. 绘制一个矩形
// 3-1. 设置填充矩形的填充颜色, 使用渐变
ctx.fillStyle = linearGradient
// 3-2. 绘制矩形
ctx.fillRect(100, 100, 400, 100)


复制代码

●这样渐变颜色就出现了
●接下来我们缩小矩形范围

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 制定渐变方案
// 2-1. 生成一个渐变方案
const linearGradient = ctx.createLinearGradient(100, 100, 500, 200)
// 2-2. 添加渐变颜色
linearGradient.addColorStop(0, 'red')
linearGradient.addColorStop(1, 'orange')

// 3. 绘制一个矩形
// 3-1. 设置填充矩形的填充颜色, 使用渐变
ctx.fillStyle = linearGradient
// 3-2. 绘制矩形
ctx.fillRect(100, 100, 300, 100)


复制代码

●我们会看到, 我们只能看到完整渐变的一部分了
●注意 : 渐变不是根据你的图形而制定的, 而是根据画布制定的
●文本内容也是可以使用线性渐变的

径向渐变
●和刚才的线性渐变是一样的
○先要制定渐变方案
○然后向渐变方案内添加颜色
●剩下的就是在使用的时候直接使用渐变方案即可
●语法 : ctx.createRadialGradient(x1, y1, r1, x2, y2, r2)
○x1 : 起始圆圆心 x 轴坐标
○y1 : 起始圆圆心 y 轴坐标
○r1 : 起始圆半径
○x2 : 终止圆圆心 x 轴坐标
○y2 : 终止圆圆心 y 轴坐标
○r2 : 终止圆半径

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 制定渐变方案
// 2-1. 生成一个渐变方案
const radialGradient = ctx.createRadialGradient(100, 100, 100, 500, 200, 50)
// 2-2. 向渐变方案内填充颜色
radialGradient.addColorStop(0, 'red')
radialGradient.addColorStop(1, 'orange')


复制代码

●这个渐变方案是什么样子的内, 不太好用文字描述
●其实就是两个圆的切线相连, 绘制的区域为渐变区域
●看下面这个例子

●这样可能更明确一些
●注意 : 渐变是包含开始圆位置, 但是不包含终止圆的位置的
●按照切线相连的区域, 超出去的部分会用纯色填充, 由 canvas 自己计算
●按照我们刚才绘制的渐变方案, 咱们绘制一个和画布一样大小的矩形就能看出效果了

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 制定渐变方案
// 2-1. 生成一个渐变方案
const radialGradient = ctx.createRadialGradient(100, 100, 100, 500, 200, 50)
// 2-2. 向渐变方案内填充颜色
radialGradient.addColorStop(0, 'red')
radialGradient.addColorStop(1, 'orange')

// 3. 绘制矩形
// 3-1. 使用渐变方案
ctx.fillStyle = radialGradient
// 3-2. 绘制矩形
ctx.fillRect(0, 0, 600, 300)


复制代码

●这就是径向渐变
●文本内容也是可以使用径向渐变的

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

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

相关文章

ip数据报计算首部检验和

当我们在使用互联网进行数据传输时,数据可能会被篡改或者损坏。为了保证数据传输的可靠性和完整性,计算IP数据包首部检验和是一种非常重要的校验机制。本文将会介绍计算IP数据包首部检验和的方法。 IP数据包首部 首先,我们需要了解IP数据包…

5 系统数据文件和信息

5.1 口令文件 口令文件包含了下表中所示的各字段&#xff0c;这些字段包含在<pwd.h>中定义的passwd结构中。 /etc/passwd文件中的字段 说 明struct passwd 成员用户名char *pw_name加密口令char *pw_passwd数值用户IDuid_t pw_uid数值组IDgid_t pw_gid注释字段char *pw_g…

Unity实现GPU Cull渲染

前言 开放世界游戏中植被和物件的数量往往是巨大, 而传统组织大量植被渲染的方式是利用QuadTree/Octree/Kd-Tree等数据结构对植被Intance数据进行预先生成一个个Cluster&#xff0c;然后在运行时进行FrustumCull,收集可视的所有Cluster&#xff0c;最后进行DrawInstance. 这…

Yolov1 源码讲解 loss.py

结构 1.lt rb我觉得不是很合适 正确来说是lb rt 因为比较出来的都是左下和右上坐标 比如前两个&#xff0c;都是max出来的 选两个box左下坐标中最大的&#xff0c; 后两个则是右上坐标中最小的 那也就形成了交集面积 但是代码中仍然是lt rb我也就直接这样说 而算出lt和r…

zynq基于XDMA实现PCIE X8视频采集HDMI输出 提供工程源码和QT上位机程序和技术支持

目录 1、前言2、我已有的PCIE方案3、基于zynq架构的PCIE4、总体设计思路和方案视频输入通路PCIE数据缓存通路视频输出通路 5、vivado工程详解6、SDK 工程详解7、驱动安装8、QT上位机软件9、上板调试验证10、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Expre…

二叉树的实现

二叉树 文章目录 二叉树背景二叉树的概念遍历方式代码实现 背景 数组存储方式的分析 优点&#xff1a;通过下标方式访问元素&#xff0c;速度快。对于有序数组&#xff0c;还可使用二分查找提高检索速度。 缺点&#xff1a;如果要检索具体某个值&#xff0c;或者插入值(按一…

linux中使用docker部署微服务

目录 一、制作jar包&#xff08;如果看一眼很简单&#xff0c;可以直接使用结尾的jar&#xff09; 1.首先创建一个微服务 demo2 2.启动微服务&#xff08;在DemoApplication上右键执行启动就行&#xff09; 注意&#xff1a;其他操作导致的 可能遇到的报错 3.修改端口 4.新…

ChatGPT的快速发展究竟给我们带来了什么?

&#x1f61a;一个不甘平凡的普通人&#xff0c;致力于为Golang社区和算法学习做出贡献&#xff0c;期待您的关注和认可&#xff0c;陪您一起学习打卡&#xff01;&#xff01;&#xff01;&#x1f618;&#x1f618;&#x1f618; &#x1f917;专栏&#xff1a;算法学习 &am…

java基础入门-05-【面向对象进阶(static继承)】

Java基础入门-05-【面向对象进阶&#xff08;static&继承&#xff09;】 13、面向对象进阶&#xff08;static&继承&#xff09;1.1 如何定义类1.2 如何通过类创建对象1.3 封装1.3.1 封装的步骤1.3.2 封装的步骤实现 1.4 构造方法1.4.1 构造方法的作用1.4.2 构造方法的…

Unity API详解——Random类

Random类是Unity中用于产生随机数的类&#xff0c;不可以实例化&#xff0c;只有静态属性和静态方法。本博客主要介绍了Random类的一些静态属性。 文章目录 一、Random类静态属性1、基本语法2、功能说明3、代码实现 二、rotationUniform属性1、基本语法2、功能说明1、规范化向量…

前沿探索,AI 在 API 开发测试中的应用

目录 一、引言二、AI 加持下的 API 设计1、NLP 在 API 设计中的应用2、DL 在 API 设计中的应用能力一&#xff1a;Apikit 如何利用 AI 生成最佳的 API 设计方案能力二&#xff1a; Apikit 如何利用 AI 提高 API 的可用性和易用性 三、AI 加持下的 API 开发能力三&#xff1a;Ap…

k8s二进制安装部署(详细)(3主2从)

目录 kubeadm 和二进制安装 k8s 适用场景分析 多 master 节点高可用架构图 集群环境准备 部署过程 修改主机内核参数&#xff08;所有节点&#xff09; 配置阿里云的repo源&#xff08;所有节点&#xff09; 配置国内安装 docker 和 containerd 的阿里云的 repo 源 配置…

比肩 ChatGPT,国内快速访问的强大 AI 工具 Claude

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

Gateway案例

官网:Spring Cloud Gateway 中文文档:Spring Cloud Gateway 2.1.0 中文官网文档 - 腾讯云开发者社区-腾讯云 一、网关介绍: 网关就是当前微服务的统一入口 通常在微服务项目中,只有网关项目是暴露在网络里的,其他服务一般都是在内网里, 用户访问网关,网关根据访问的路径,来进…

Tomcat安装步骤及详细配置教程(2022最新版)

网上的tomcat安装及配置教程一大堆&#xff0c;但是好多都过时了&#xff0c;根本不适用现在的版本&#xff0c;今天凯歌整理一篇Tomcat安装步骤及详细配置教程&#xff0c;2022年最新版~ Tomcat安装及配置教程主要分为四步&#xff1a; 步骤一&#xff1a;首先确认自己是否已…

ChatGPT登录操作扫盲级教程,附ChatGPT登录常见报错及处理技巧

文 / 韩彬&#xff08;微信公众号&#xff1a;量子论&#xff09; 有了帐号&#xff0c;我们自然可以使用ChatGPT尽情玩耍了。 知识扩展&#xff1a;ChatGPT是啥&#xff0c;以及注册的问题&#xff0c;可以看《ChatGPT常见问题手册&#xff0c;通俗易懂版&#xff0c;3分钟了解…

Windows微信聊天图片文件的解码和图片、视频占满电脑磁盘空间的清理

1 问题现象 我的Windows版微信最近老是提示“磁盘空间不足200MB&#xff0c;需及时清理磁盘”。 使用文件资源管理器查看我的电脑磁盘使用情况&#xff0c;发现C盘只剩下174MB空间可用。系统盘C盘空间耗尽已经严重影响电脑的使用。 2 问题分析 2.1 磁盘空间占用情况分析 由于…

【学习笔记】pandas提取excel数据形成三元组,采用neo4j数据库构建小型知识图谱

前言 代码来自github项目 neo4j-python-pandas-py2neo-v3&#xff0c;项目作者为Skyelbin。我记录一下运行该项目的一些过程文字以及遇到的问题和解决办法。 一、提取excel中的数据转换为DataFrame三元组格式 from dataToNeo4jClass.DataToNeo4jClass import DataToNeo4j imp…

实操带你使用Mybatis_plus(2)

文章目录 一、通用ServiceService CRUD 接口a> IServiceb>创建Service接口和实现类测试 二、常用注解1、TableName2、TableId雪花算法3、TableField4、TableLogic 一、通用Service Service CRUD 接口 通用 Service CRUD 封装IService 接口&#xff0c;进一步封装 CRUD …

选择无服务器:Babbel 的迁移故事

Babbel 是什么&#xff1f; Babbel 是一个完整的语言学习产品生态系统&#xff0c;囊括了世界上最畅销的语言学习应用程序。我们已售出超过 1000 万份订阅和超过 60,000 门涵盖 14 种语言的课程&#xff0c;创造了全球第一语言学习目的地。自 2007 年推出产品的第一天起&#…