CanvasRenderingContext2D:putImageData() 方法
Canvas 2D API 的 CanvasRenderingContext2D.putImageData()
方法将来自给定 ImageData
对象的数据绘制到画布上。如果提供了脏矩形,则仅绘制该矩形中的像素。此方法不受画布变换矩阵的影响。
注意:可以使用 getImageData()
方法从画布中检索图像数据。
您可以在文章 使用画布进行像素操作 中找到有关 putImageData()
和画布内容的一般操作的更多信息。
语法
js
putImageData(imageData, dx, dy)
putImageData(imageData, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight)
参数
imageData
-
包含像素值数组的
ImageData
对象。 dx
-
在目标画布中放置图像数据的水平位置(x 坐标)。
dy
-
在目标画布中放置图像数据的垂直位置(y 坐标)。
dirtyX
可选-
将从中提取图像数据的左上角的水平位置(x 坐标)。默认为
0
。 dirtyY
可选-
将从中提取图像数据的左上角的垂直位置(y 坐标)。默认为
0
。 dirtyWidth
可选-
要绘制的矩形的宽度。默认为图像数据的宽度。
dirtyHeight
可选-
要绘制的矩形的高度。默认为图像数据的高度。
返回值
无 (undefined
).
异常
NotSupportedError
DOMException
-
如果任何参数为无穷大,则抛出。
InvalidStateError
DOMException
-
如果
ImageData
对象的数据已分离,则抛出。
示例
了解 putImageData
要了解此算法在幕后做了什么,以下是在 CanvasRenderingContext2D.fillRect()
之上的实现。
HTML
html
<canvas id="canvas"></canvas>
JavaScript
js
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
function putImageData(
ctx,
imageData,
dx,
dy,
dirtyX,
dirtyY,
dirtyWidth,
dirtyHeight,
) {
const data = imageData.data;
const height = imageData.height;
const width = imageData.width;
dirtyX = dirtyX || 0;
dirtyY = dirtyY || 0;
dirtyWidth = dirtyWidth !== undefined ? dirtyWidth : width;
dirtyHeight = dirtyHeight !== undefined ? dirtyHeight : height;
const limitBottom = dirtyY + dirtyHeight;
const limitRight = dirtyX + dirtyWidth;
for (let y = dirtyY; y < limitBottom; y++) {
for (let x = dirtyX; x < limitRight; x++) {
const pos = y * width + x;
ctx.fillStyle = `rgb(${data[pos * 4 + 0]} ${data[pos * 4 + 1]}
${data[pos * 4 + 2]} / ${data[pos * 4 + 3] / 255})`;
ctx.fillRect(x + dx, y + dy, 1, 1);
}
}
}
// Draw content onto the canvas
ctx.fillRect(0, 0, 100, 100);
// Create an ImageData object from it
const imagedata = ctx.getImageData(0, 0, 100, 100);
// use the putImageData function that illustrates how putImageData works
putImageData(ctx, imagedata, 150, 0, 50, 50, 25, 25);
结果
由于浏览器优化导致的数据丢失
警告:由于将预乘 alpha 颜色值转换为和从预乘 alpha 颜色值转换的损失性,使用 putImageData()
刚刚设置的像素可能以不同的值返回给等效的 getImageData()
。
JavaScript
js
const canvas = document.createElement("canvas");
canvas.width = 1;
canvas.height = 1;
const context = canvas.getContext("2d");
const imgData = context.getImageData(0, 0, canvas.width, canvas.height);
const pixels = imgData.data;
pixels[0 + 0] = 1;
pixels[0 + 1] = 127;
pixels[0 + 2] = 255;
pixels[0 + 3] = 1;
console.log("before:", pixels);
context.putImageData(imgData, 0, 0);
const imgData2 = context.getImageData(0, 0, canvas.width, canvas.height);
const pixels2 = imgData2.data;
console.log("after:", pixels2);
输出可能如下所示
before: Uint8ClampedArray(4) [ 1, 127, 255, 1 ] after: Uint8ClampedArray(4) [ 255, 255, 255, 1 ]
规范
规范 |
---|
HTML 标准 # dom-context-2d-putimagedata-dev |
浏览器兼容性
BCD 表仅在浏览器中加载