HTML Canvas 图片处理详解
Canvas 基础概念
HTML5 <canvas>
元素是一个矩形区域,可通过 JavaScript 动态绘制图形、图像或动画,其核心是 CanvasRenderingContext2D
接口,提供丰富的绘图 API。
getContext('2d')
width
/ height
toDataURL()
绘制图片的基本步骤
-
获取 Canvas 上下文
const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d');
-
创建 Image 对象
const img = new Image(); img.src = 'example.jpg'; // 图片路径
-
监听图片加载完成
img.onload = () => { ctx.drawImage(img, 0, 0); // 绘制到画布 (0,0) 位置 };
常用 API 方法
方法 | 参数 | 作用 |
---|---|---|
drawImage(image, dx, dy) |
图片对象,目标 x/y 坐标 | 在指定位置绘制图片 |
drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) |
源区域坐标/尺寸,目标区域坐标/尺寸 | 裁剪并缩放图片 |
createPattern(image, repetition) |
图片对象,重复模式(repeat /repeat-x /repeat-y /no-repeat ) |
创建填充图案 |
图片处理技巧
-
像素级操作
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); // 修改像素数据(如 imageData.data) ctx.putImageData(imageData, 0, 0);
-
图片裁剪与缩放
ctx.drawImage(img, 50, 50, 200, 200, 0, 0, 300, 300); // 裁剪源图 (50,50) 区域并缩放
-
旋转与合成
ctx.save(); // 保存状态 ctx.translate(150, 150); // 设置旋转中心 ctx.rotate(Math.PI / 4); // 旋转 45 度 ctx.drawImage(img, -img.width/2, -img.height/2); // 绘制居中图片 ctx.restore(); // 恢复状态
性能优化建议
- 离屏 Canvas:用多个离屏 Canvas 分层绘制,减少主画布重绘。
- 请求动画帧:动画场景使用
requestAnimationFrame
替代setInterval
。 - 图片预加载:确保图片加载完成后再绘制,避免渲染中断。
实际应用案例
-
图片编辑器
- 通过
drawImage
实现裁剪、缩放、旋转。 - 结合
getImageData
实现滤镜效果(如灰度化、反相)。
- 通过
-
图表绘制
将图片作为背景,叠加数据图层(如折线图、柱状图)。
-
动画与游戏
const dataURL = canvas.toDataURL('image/png');
const blob = new Blob([atob(dataURL.split(',')[1])], { type: 'image/png' });
const url = URL.createObjectURL(blob);问题2:如何处理跨域图片的绘制问题?
解答:
需确保图片服务器允许跨域访问,设置Access-Control-Allow-Origin
头,若无法控制服务器,可使用代理服务器中转图片,或在