上一篇
在HTML5画布中移动图片使用translate()方法改变坐标系原点;调整图片大小则通过drawImage()的参数设置目标宽高或缩放变换实现,两者结合可控制图片位置与尺寸。
在HTML5画布(Canvas)中移动和调整图片大小是常见的交互需求,通过Canvas API的drawImage()方法即可实现,以下是详细步骤和注意事项:
核心原理
Canvas通过drawImage()方法绘制图像,其参数可控制位置和尺寸:
ctx.drawImage(image, dx, dy, dWidth, dHeight);
image:图片对象dx, dy:画布上的起始坐标(移动位置)dWidth, dHeight:绘制尺寸(调整大小)
实现步骤
加载图片
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
const img = new Image();
img.onload = () => {
// 图片加载完成后绘制
ctx.drawImage(img, 0, 0, img.width, img.height);
};
img.src = 'path/to/image.jpg'; // 设置图片路径
移动图片
修改dx和dy参数:

// 向右移动50px,向下移动30px ctx.clearRect(0, 0, canvas.width, canvas.height); // 清除画布 ctx.drawImage(img, 50, 30, img.width, img.height);
调整图片大小
修改dWidth和dHeight参数:
// 缩小为原图的50% const scale = 0.5; ctx.drawImage(img, 0, 0, img.width * scale, img.height * scale); // 拉伸为200x100像素 ctx.drawImage(img, 0, 0, 200, 100);
同时移动和调整大小
// 在坐标(100,50)处绘制宽300px、高200px的图片 ctx.drawImage(img, 100, 50, 300, 200);
动态交互示例(拖动滑块调整)
<canvas id="myCanvas" width="800" height="500"></canvas>
<input type="range" id="sizeSlider" min="0.1" max="2" step="0.1" value="1">
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
const sizeSlider = document.getElementById('sizeSlider');
const img = new Image();
img.onload = () => renderImage();
img.src = 'image.jpg';
function renderImage() {
const scale = parseFloat(sizeSlider.value);
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(
img,
50, // X坐标
30, // Y坐标
img.width * scale, // 宽度
img.height * scale // 高度
);
}
sizeSlider.addEventListener('input', renderImage);
</script>
关键注意事项
-
跨域问题:

- 若图片来自其他域名,需服务器设置
Access-Control-Allow-Origin响应头 - 在
img对象添加crossOrigin属性:img.crossOrigin = 'Anonymous'; // 允许跨域
- 若图片来自其他域名,需服务器设置
-
图像清晰度:
- 放大图片可能导致锯齿,使用
imageSmoothingEnabled平滑图像:ctx.imageSmoothingEnabled = true; ctx.imageSmoothingQuality = 'high'; // low/medium/high
- 放大图片可能导致锯齿,使用
-
性能优化:

- 频繁重绘画布时,使用
requestAnimationFrame避免卡顿 - 复杂操作建议使用离屏Canvas缓存
- 频繁重绘画布时,使用
-
坐标系控制:
- 通过
translate()方法移动坐标系原点:ctx.translate(100, 100); // 原点移至(100,100) ctx.drawImage(img, 0, 0); // 图片将在新原点绘制
- 通过
应用场景
- 图片编辑器中的缩放/拖拽功能
- 游戏角色动态调整
- 响应式图像展示(适应不同屏幕尺寸)
引用说明参考MDN Web文档Canvas API和W3C Canvas规范,结合前端开发最佳实践总结而成,具体实现细节可查阅drawImage()文档。
