学习canvas(一些常用api)

news/2024/9/19 3:35:35/文章来源:https://www.cnblogs.com/HugoKwong/p/18290273

当然,以下是这些常用Canvas API的总结,按照Markdown格式编写:

常用Canvas API总结

1. 获取绘图上下文

const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d'); // 或 'webgl'

2. 绘制矩形

ctx.fillStyle = 'blue';
ctx.fillRect(10, 10, 150, 100); // 填充矩形ctx.strokeStyle = 'red';
ctx.strokeRect(20, 20, 150, 100); // 描边矩形ctx.clearRect(30, 30, 50, 50); // 清除矩形区域

3. 绘制路径

ctx.beginPath();
ctx.moveTo(50, 50);
ctx.lineTo(200, 50);
ctx.lineTo(200, 200);
ctx.closePath();
ctx.stroke();ctx.beginPath();
ctx.arc(150, 150, 75, 0, Math.PI * 2, true);
ctx.fill();

4. 绘制文本

ctx.font = '30px Arial';
ctx.fillStyle = 'black';
ctx.fillText('Hello Canvas', 50, 50);ctx.strokeStyle = 'blue';
ctx.strokeText('Hello Canvas', 50, 100);

5. 绘制图像

const img = new Image();
img.onload = function() {ctx.drawImage(img, 10, 10, 100, 100); // 绘制图像
}
img.src = 'path/to/image.jpg';

6. 坐标变换

ctx.translate(50, 50); // 平移
ctx.rotate(Math.PI / 4); // 旋转
ctx.scale(2, 2); // 缩放ctx.fillRect(0, 0, 100, 100);

7. 渐变

const gradient = ctx.createLinearGradient(0, 0, 200, 0);
gradient.addColorStop(0, 'red');
gradient.addColorStop(1, 'blue');ctx.fillStyle = gradient;
ctx.fillRect(10, 10, 200, 100);

8. 阴影

ctx.shadowColor = 'rgba(0, 0, 0, 0.5)';
ctx.shadowBlur = 10;
ctx.shadowOffsetX = 5;
ctx.shadowOffsetY = 5;ctx.fillStyle = 'red';
ctx.fillRect(50, 50, 100, 100);

9. 导出Canvas内容

const dataURL = canvas.toDataURL('image/png');
const button = document.getElementById('saveButton');
button.addEventListener('click', () => {canvas.toBlob((blob) => {const link = document.createElement('a');link.href = URL.createObjectURL(blob);link.download = 'canvas_image.png';link.click();URL.revokeObjectURL(link.href);}, 'image/png');
});

10. 测量文本

ctx.font = '30px Arial';
const metrics = ctx.measureText('Hello Canvas');
console.log(`Text width: ${metrics.width}px`);

11. 创建图案

const img = new Image();
img.onload = function() {const pattern = ctx.createPattern(img, 'repeat');ctx.fillStyle = pattern;ctx.fillRect(0, 0, 500, 500);
}
img.src = 'path/to/pattern.jpg';

12. 虚线

ctx.setLineDash([5, 15]);  // 虚线样式 [线条长度, 间隙长度]
ctx.lineDashOffset = 10;   // 虚线的偏移量
ctx.strokeRect(50, 50, 200, 200);

13. 剪切区域

ctx.beginPath();
ctx.arc(100, 100, 75, 0, Math.PI * 2, true);
ctx.clip();ctx.fillStyle = 'green';
ctx.fillRect(0, 0, 200, 200);  // 只有在圆形区域内的部分会被绘制

14. 检测点是否在路径或描边内

ctx.beginPath();
ctx.rect(50, 50, 100, 100);
ctx.stroke();console.log(ctx.isPointInPath(75, 75));  // true
console.log(ctx.isPointInStroke(75, 75)); // false

15. 设置全局透明度

ctx.globalAlpha = 0.5;
ctx.fillStyle = 'blue';
ctx.fillRect(50, 50, 100, 100);

16. 设置组合操作

ctx.globalCompositeOperation = 'destination-over';  // 绘制在已有内容下面
ctx.fillStyle = 'yellow';
ctx.fillRect(100, 100, 100, 100);

17. 绘制焦点环

const button = document.createElement('button');
document.body.appendChild(button);
button.focus();
ctx.drawFocusIfNeeded(button);

18. 读取和写入像素数据

const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
for (let i = 0; i < imageData.data.length; i += 4) {imageData.data[i] = 255 - imageData.data[i];     // 反转红色imageData.data[i+1] = 255 - imageData.data[i+1]; // 反转绿色imageData.data[i+2] = 255 - imageData.data[i+2]; // 反转蓝色
}
ctx.putImageData(imageData, 0, 0);

19. 创建空白ImageData对象

const newImageData = ctx.createImageData(100, 100);
for (let i = 0; i < newImageData.data.length; i += 4) {newImageData.data[i] = 255;  // RednewImageData.data[i+1] = 0;  // GreennewImageData.data[i+2] = 0;  // BluenewImageData.data[i+3] = 255; // Alpha
}
ctx.putImageData(newImageData, 50, 50);

20. 保存和恢复Canvas状态

ctx.save();  // 保存当前状态ctx.fillStyle = 'blue';
ctx.fillRect(10, 10, 100, 100);ctx.restore();  // 恢复到保存时的状态
ctx.fillRect(150, 10, 100, 100); // 这个矩形将会使用之前的状态

21. 线条末端和连接处样式

ctx.lineWidth = 10;ctx.lineCap = 'round';  // 设置线条末端样式:butt, round, square
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.lineTo(150, 50);
ctx.stroke();ctx.lineJoin = 'bevel';  // 设置线条连接处样式:bevel, round, miter
ctx.beginPath();
ctx.moveTo(50, 150);
ctx.lineTo(150, 150);
ctx.lineTo(100, 200);
ctx.stroke();

22. 绘制圆弧连接的直线

ctx.beginPath();
ctx.moveTo(50, 50);
ctx.arcTo(150, 50, 150, 150, 50); // 从(50,50)到(150,50),再到(150,150),圆弧半径为50
ctx.stroke();

23. 绘制贝塞尔曲线

ctx.beginPath();
ctx.moveTo(50, 250);
ctx.quadraticCurveTo(150, 200, 250, 250); // 二次贝塞尔曲线,控制点为(150,200),终点为(250,250)
ctx.stroke();ctx.beginPath();
ctx.moveTo(50, 350);
ctx.bezierCurveTo(150, 300, 250, 400, 350, 350); // 三次贝塞尔曲线,控制点为(150,300)和(250,400),终点为(350,350)
ctx.stroke();

这些API涵盖了Canvas在绘图、动画、图像处理、路径操作等方面的广泛应用。在企业级应用中,熟练掌握和灵活运用这些API可以大大提高图形处理和用户界面设计的效率和质量。

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

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

相关文章

uniapp 解决本地跨域问题

让每一滴智慧绘制成一条不归路!

UniVAE:基于Transformer的单模型、多尺度的VAE模型

大家都知道,Transformer的$\mathscr{O}(n^2)$复杂度是它的“硬伤”之一。不过凡事有弊亦有利,$\mathscr{O}(n^2)$的复杂度也为Transformer带来很大的折腾空间,我们可以灵活地定制不同的attention mask,来设计出不同用途的Transformer模型来,比如UniLM、K-BERT等。 本文介绍…

从变分编码、信息瓶颈到正态分布:论遗忘的重要性

这是一篇“散文”,我们来谈一下有着千丝万缕联系的三个东西:变分自编码器、信息瓶颈、正态分布。 众所周知,变分自编码器是一个很经典的生成模型,但实际上它有着超越生成模型的含义;而对于信息瓶颈,大家也许相对陌生一些,然而事实上信息瓶颈在去年也热闹了一阵子;至于正…

应用升级

本文是在你已经安装三个软件的基础上进行优化 一、卸载NFG Multi Crack软件(没有就不用管) 二、进入Lsposed软件 点击模块,可以看到已安装的两个模块1. 点击FL-Xposed,勾选以下应用,然后返回2. 点击HookVip,勾选Fakelocation,然后返回三、进入隐藏应用列表软件 1. 点击模…

哪些方法可以将word导出为pdf格式?

在日常工作和学习中,我们经常需要将Word文档转换为PDF格式,以便更好地保存、分享和打印文件。PDF格式具有跨平台兼容性好、不易被篡改等优点,因此得到了广泛应用。那么Word如何转PDF呢?本文将介绍三种实用的word转pdf的方法,帮助读者轻松实现文档格式的转换。 方法一:使用…

2024春秋杯 stdout

考点:文件,setvbuf缓冲区,ret2syscall,ret2csu 题目给了libc文件。 main函数和vlun函数存在明显的栈溢出 int __cdecl main(int argc, const char **argv, const char **envp) {char buf[80]; // [rsp+0h] [rbp-50h] BYREFinit(argc, argv, envp);puts("where is my s…

怎么看时序图

时序图看法 从上到下,从左到右 看一个单位时间,拆分成一个一个模块 简单的时序图,一根线串口通信SPIS时序图总体传输24个bit注意无效电平可能传输不同的电平

工程仪器振弦采集仪的设计与研发进展

工程仪器振弦采集仪的设计与研发进展 工程仪器振弦采集仪是一种用于测量和记录物体振动参数的仪器。它能够实时采集物体的振动信号,并通过内部的传感器将振动信号转化为电信号,然后进行信号放大和处理,最终以数字形式显示或存储。 河北稳控科技振弦采集仪的设计与研发进展主…

近似排序......

一年没动算法的蒻蒟随手点开了之前做过的一道【近似排序】,然后开始了,恢复之旅......TFLSOJ【近似排序】 看到题目经简单分析后先写出了一种傻瓜解法,(可能叫 暴力??) #include<bits/stdc++.h> using namespace std; int x,y; int a[110]; int main(){cin>&g…

SMU Summer 2024 Contest Round 1

SMU Summer 2024 Contest Round 1 Dice and Coin 题意 给个 n 面骰子和一枚硬币,初始投骰子,若骰子的值在 1 到 \(K-1\) 之间则反复投硬币,硬币为正则该值翻倍,否则为 0 ,当值为 0 输掉游戏或者大于等于 \(K\) 时赢得游戏结束,问你可以赢得游戏的概率为多少。 思路 以 1 …

分布式事务最经典的七种解决方案

转载:后端 - 分布式事务最经典的七种解决方案 - 分布式事务 - SegmentFault 思否 随着业务的快速发展、业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微服务架构。随之而来就必然遇到分布式事务这个难题。 这篇文章首先介绍了相关的基础理论,然后…

江门数字化mes系统定制哪家好 珠海盈致mes系统服务商

对于江门数字化MES系统的定制服务,选择珠海盈致科技是一个不错的选择。珠海盈致科技是一家专业的智能制造解决方案提供商,具有丰富的数字化制造和MES系统定制经验。以下是选择珠海盈致科技的一些优势: 专业团队:珠海盈致科技拥有一支专业的团队,包括软件工程师、制造业专家…