CanvasRenderingContext2D: getImageData() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

Canvas 2D API 的 CanvasRenderingContext2D 方法 getImageData() 会返回一个 ImageData 对象,该对象表示画布指定区域的底层像素数据。

此方法不受画布变换矩阵的影响。如果指定的矩形超出了画布的边界,则在返回的 ImageData 对象中,画布外的像素将显示为透明黑色。

注意: 可以使用 putImageData() 方法将图像数据绘制到画布上。

您可以在 使用 Canvas 进行像素处理 中找到有关 getImageData() 和画布内容通用操作的更多信息。

语法

js
getImageData(sx, sy, sw, sh)
getImageData(sx, sy, sw, sh, settings)

参数

sx

要从中提取 ImageData 的矩形的左上角 x 轴坐标。

sy

要从中提取 ImageData 的矩形的左上角 y 轴坐标。

sw

要从中提取 ImageData 的矩形的宽度。正值向右,负值向左。

sh

要从中提取 ImageData 的矩形的高度。正值向下,负值向上。

settings 可选

具有以下属性的对象:

colorSpace

指定图像数据的颜色空间。可以设置为 "srgb" 表示 sRGB 颜色空间,或设置为 "display-p3" 表示 display-p3 颜色空间

pixelFormat

指定像素格式。可能的值:

  • "rgba-unorm8":表示 8 位每分量无符号归一化格式的 RGBA,使用 Uint8ClampedArray
  • "rgba-float16":表示 16 位每分量的 RGBA,使用 Float16Array。浮点像素值允许表示任意宽色域和高动态范围 (HDR) 的颜色。

返回值

一个 ImageData 对象,包含画布指定矩形的图像数据。矩形左上角的坐标是 (sx, sy),右下角坐标是 (sx + sw - 1, sy + sh - 1)

异常

IndexSizeError DOMException

如果 swsh 为零,则会抛出此异常。

SecurityError DOMException

画布包含或可能包含来自非文档加载源的像素。为避免在此情况下抛出 SecurityError DOMException,请配置 CORS 以允许以这种方式使用源图像。请参阅 允许跨域使用图像和画布

示例

从画布获取图像数据

此示例绘制一个图像,然后使用 getImageData() 获取画布的一部分。

我们使用 getImageData() 提取图像的一个切片,起始于 (10, 20),宽度为 80,高度为 230。然后我们将此切片绘制三次,将切片依次放置在上一个切片的下方和右侧。

HTML

html
<canvas id="canvas" width="700" height="400"></canvas>

JavaScript

js
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

const image = new Image();
image.src = "plumeria.jpg";
image.addEventListener("load", () => {
  ctx.drawImage(image, 0, 0, 233, 320);

  const imageData = ctx.getImageData(10, 20, 80, 230);
  ctx.putImageData(imageData, 260, 0);
  ctx.putImageData(imageData, 380, 50);
  ctx.putImageData(imageData, 500, 100);
});

结果

颜色空间转换

可选的 colorSpace 设置允许您以所需的格式获取图像数据。

js
const context = canvas.getContext("2d", { colorSpace: "display-p3" });
context.fillStyle = "color(display-p3 0.5 0 0)";
context.fillRect(0, 0, 10, 10);

// Get ImageData converted to sRGB
const imageData = context.getImageData(0, 0, 1, 1, { colorSpace: "srgb" });
console.log(imageData.colorSpace); // "srgb"

获取不同像素格式的数据

可选的 pixelFormat 设置允许您以所需的像素格式获取图像数据。

js
const context = canvas.getContext("2d");

const imageData = context.getImageData(0, 0, 1, 1);
console.log(imageData.pixelFormat); // "rgba-unorm8"

const imageData = context.getImageData(0, 0, 1, 1, {
  pixelFormat: "rgba-float16",
});
console.log(imageData.pixelFormat); // "rgba-float16"

规范

规范
HTML
# dom-context-2d-getimagedata-dev

浏览器兼容性

另见