强化对 Canvas 中 drawImage 方法参数的理解

在对 Canvas 画布绘图时,我们常使用的函数必然少不了 drawImage。但因其参数巨多,且各参数可以组合多种语法让人难以短时记忆。所以避免后续绘制 Canvas 时出现图片裁剪、元素定位等问题,这里对 drawImage 做一个便于理解的小结。


绘制图像(drawImage)的标准语法:

ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
ctx.drawImage(image, dx, dy, dWidth, dHeight);
ctx.drawImage(image, dx, dy);

为了便于理解,可以将 drawImage 的参数拆分为三部分

(image[, 图片裁剪参数], 画布绘制区域参数) 下面通过 ES6 语法进行详解:

let image = document.querySelector('#img')
let canvas = document.querySelector('#canvas')
let ctx = canvas.getContext('2d')

/**
 * @brief 裁剪 image 的指定区域
 * @notice 1、如果 imageParams 中的 sWidth, sWidth 未赋值,则从(sx,sy)作为起始坐标,一直裁剪到源图片的右下角
 * @notice 2、imageParams 为可选项,默认绘制全尺寸源图片
 * @example 省略 imageParams 语法:ctx.drawImage(image, dx, dy, dWidth, dHeight)
 */
let imageParams = [
	0,            // [ sx       ] 裁剪 image 的起始点 X 轴坐标
	0,            // [ sy       ] 裁剪 image 的起始点 Y 轴坐标
	image.width,  // [ sWidth   ] 裁剪的宽度
	image.height  // [ sHeight  ] 裁剪的高度
];

/**
 * @brief 在 Canvas 画布上指定一片区域绘制剪裁后的 image
 * @notice 1、如果 Canvas 的 dWidth, dHeight 未赋值。则绘制完整尺寸的 image,其宽高不会缩放
 * @example 省略 imageParams 和 Canvas 的绘制宽高后,其语法:ctx.drawImage(image, dx, dy)
 */
let canvasParams = [
	0,            // [ dx       ] 在 Canvas 元素上绘制起始点 X 轴坐标
	0,            // [ dy       ] 在 Canvas 元素上绘制起始点 Y 轴坐标
	canvas.width, // [ dWidth   ] 在 Canvas 元素上绘制图像的宽度
	canvas.height // [ dHeight  ] 在 Canvas 元素上绘制图像的高度
];

// ES6 简写:
ctx.drawImage(image, ...imageParams, ...canvasParams);