Canvas 绘图基础

简介: Canvas是HTML5的绘图API,通过JavaScript实现像素级图形、动画和游戏开发。支持矩形、路径、圆形、文本、图像及渐变绘制,结合requestAnimationFrame可制作高性能动画,广泛应用于数据可视化、游戏与交互设计。

Canvas 绘图基础

什么是 Canvas?

Canvas 是 HTML5 提供的一个绘图 API,它允许开发者使用 JavaScript 在网页上绘制图形、动画和游戏。与传统的 DOM 操作不同,Canvas 提供的是一个像素级的绘图环境,特别适合需要高性能图形渲染的场景。

基本特性

  • 即时渲染:所有绘图操作都会立即反映在画布上
  • 无状态Canvas 不会记住绘制的内容,需要开发者手动管理
  • 高性能:适合复杂动画和游戏开发
  • 跨平台:在所有现代浏览器中都得到良好支持

开始使用 Canvas

1. 创建 Canvas 元素

HTML 文件中添加 canvas 标签:

<canvas id="myCanvas" width="500" height="300">
  您的浏览器不支持 Canvas,请升级或更换浏览器
</canvas>

2. 获取绘图上下文

JavaScript 中获取绘图上下文:

const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d'); // 获取 2D 绘图上下文

基础绘图操作

绘制矩形

Canvas 提供了三种绘制矩形的方法:

// 填充矩形
ctx.fillStyle = 'red'; // 设置填充颜色
ctx.fillRect(10, 10, 100, 50); // (x, y, width, height)

// 描边矩形
ctx.strokeStyle = 'blue'; // 设置描边颜色
ctx.lineWidth = 3; // 设置线宽
ctx.strokeRect(150, 10, 100, 50);

// 清除矩形区域
ctx.clearRect(20, 20, 80, 30); // 清除指定区域

绘制路径

路径是 Canvas 中绘制复杂图形的基础:

// 开始路径
ctx.beginPath();
ctx.moveTo(50, 50); // 起点
ctx.lineTo(150, 50); // 第一条线
ctx.lineTo(100, 150); // 第二条线
ctx.closePath(); // 闭合路径

// 描边或填充
ctx.strokeStyle = 'green';
ctx.stroke();

ctx.fillStyle = 'rgba(255, 0, 0, 0.5)';
ctx.fill();

绘制圆形

使用 arc 方法绘制圆形或圆弧:

ctx.beginPath();
ctx.arc(200, 200, 50, 0, Math.PI * 2); // (x, y, radius, startAngle, endAngle)
ctx.fillStyle = 'purple';
ctx.fill();

高级绘图技巧

使用渐变

Canvas 支持线性渐变和径向渐变:

// 线性渐变
const linearGradient = ctx.createLinearGradient(0, 0, 200, 0);
linearGradient.addColorStop(0, 'red');
linearGradient.addColorStop(1, 'yellow');
ctx.fillStyle = linearGradient;
ctx.fillRect(10, 200, 200, 50);

// 径向渐变
const radialGradient = ctx.createRadialGradient(350, 250, 10, 350, 250, 50);
radialGradient.addColorStop(0, 'white');
radialGradient.addColorStop(1, 'blue');
ctx.fillStyle = radialGradient;
ctx.fillRect(300, 200, 100, 100);

绘制文本

Canvas 可以绘制文本并控制其样式:

ctx.font = '30px Arial'; // 设置字体
ctx.fillStyle = 'black';
ctx.fillText('Hello Canvas', 50, 300); // 填充文本
ctx.strokeText('Hello Canvas', 50, 350); // 描边文本

图像操作

Canvas 可以绘制和操作图像:

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

  // 缩放图像
  ctx.drawImage(img, 10, 10, 100, 100);

  // 裁剪并绘制图像
  ctx.drawImage(img, 50, 50, 100, 100, 10, 10, 100, 100);
};

动画实现

Canvas 动画通常使用 requestAnimationFrame 实现:

let x = 0;
function animate() {
   
  ctx.clearRect(0, 0, canvas.width, canvas.height); // 清除画布
  ctx.fillRect(x, 50, 50, 50); // 绘制新位置
  x += 2;
  if (x < canvas.width) {
   
    requestAnimationFrame(animate); // 继续动画
  }
}
animate();

性能优化技巧

  1. 分层渲染:使用多个 canvas 元素分层绘制
  2. 离屏渲染:先在内存中绘制,再复制到显示 canvas
  3. 减少绘制区域:只重绘变化的部分
  4. 避免浮点坐标:使用整数坐标减少抗锯齿计算

实际应用案例

  1. 数据可视化:绘制图表和图形
  2. 游戏开发:2D 游戏引擎
  3. 图像处理:滤镜和特效
  4. 交互设计:自定义 UI 元素
  5. 教育工具:数学函数绘图

学习资源

  1. MDN Canvas 文档
  2. 编程伙伴 Canvas 文档
相关文章
|
10月前
|
Python
Python 的基本类型
Python 提供多种内置基本数据类型,包括数值(int、float、complex)、布尔(bool)、字符串(str)、序列(list、tuple、range)、映射(dict)、集合(set、frozenset)及二进制类型(bytes、bytearray、memoryview),还有表示空值的 None。这些类型支持动态类型特性,可灵活组合构建复杂结构,是 Python 编程的基础。
903 10
|
机器学习/深度学习 人工智能 算法
【视觉智能产品速递——人物动漫化能力上新】
VIAPI—人物动漫化!新增风格版本发布。 产品功能:人物动漫化——输入一张人物图像,生成其二次元卡通形象,返回卡通化后的结果图像。 🔥🔥🔥 本次更新风格:国风工笔画、港漫风
2089 4
【视觉智能产品速递——人物动漫化能力上新】
|
机器学习/深度学习
基于PaddleGAN精准唇形合成模型实现美女表白视频
基于PaddleGAN精准唇形合成模型实现美女表白视频
2567 0
基于PaddleGAN精准唇形合成模型实现美女表白视频
|
10月前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
5440 91
大厂CIO独家分享:AI如何重塑开发者未来十年
|
10月前
|
小程序 前端开发 安全
代练三角洲护航系统搭建/游戏代练护航代练小程序开发制作方案
代练三角洲护航系统基于UniApp+Vue前端与PHP/SpringBoot后端,集成用户管理、代练抢单、陪玩展示、支付评价等功能,支持私有化部署。专注“护航”模式,保障安全高效,提升用户体验,助力精细化运营,构建可信赖的代练服务平台。
1736 1
|
10月前
|
人工智能 前端开发 数据库
2025年最适合初学者的AI编程工具Top3:零基础也能写出专业级代码_ai代码生成器推荐
李响团队推荐2025年三款适合零基础的AI编程工具:Lynx AI、CodePal、DevMate。无需代码基础,说句话就能生成程序,帮你快速入门、边用边学,轻松迈入编程世界。
2518 154
|
10月前
|
自然语言处理 物联网 Shell
从 50 步到 4 步:LightX2V 如何把视频生成拉进20 秒时代?
LightX2V 是一款轻量级视频生成框架,通过4步蒸馏技术,将传统需50步的扩散模型压缩至仅4步,推理速度提升20倍,生成质量依旧保持影院级水准。支持文生视频与图生视频,兼容LoRA、量化等部署方案,助力AIGC高效落地。
1187 0
从 50 步到 4 步:LightX2V 如何把视频生成拉进20 秒时代?
|
12月前
|
人工智能 测试技术 开发工具
如何将 AI 代码采纳率从30%提升到80%?
AI编码采纳率低的根本原因在于人类期望其独立完成模糊需求,本文提出了解决之道,讲解如何通过结构化文档和任务拆解提高AI的基础可靠性。
2160 24
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
AgentEvolver:让智能体系统学会「自我进化」
AgentEvolver 是一个自进化智能体系统,通过自我任务生成、经验导航与反思归因三大机制,推动AI从“被动执行”迈向“主动学习”。它显著提升强化学习效率,在更少参数下实现更强性能,助力智能体持续自我迭代。开源地址:https://github.com/modelscope/AgentEvolver
3282 38