CanvasRenderingContext2D:getImageData() 方法

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Canvas 2D API 的 CanvasRenderingContext2D.getImageData() 返回一个 ImageData 对象,用于描述 canvas 指定区域的隐含像素数据。

这个方法不受画布的变换矩阵影响。如果指定的矩形超出画布的边界,返回的 ImageData 对象中超出画布边界的像素将是透明黑色。

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

你可以在像素操作中找到关于 getImageData() 和画布内容的常规操作的更多信息。

语法

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

参数

sx

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

sy

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

sw

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

sh

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

settings 可选

一个具有以下属性的对象:

返回值

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

异常

IndexSizeError DOMException

如果 swsh 中有任何一个为零时抛出。

SecurityError DOMException

画布包含或可能包含从与文档本身加载的原点不同的源加载的像素。 要避免在此情况下抛出 SecurityError DOMException,请配置 CORS 允许以这种方式使用源图像。参见允许图片和 canvas 跨源使用

示例

从画布获取图像数据

这个示例绘制了一幅图像,然后使用 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);

// 获取转换为 sRGB 的 ImageData
const imageData = context.getImageData(0, 0, 1, 1, { colorSpace: "srgb" });
console.log(imageData.colorSpace); // "srgb"

规范

Specification
HTML
# dom-context-2d-getimagedata-dev

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobile
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
getImageData

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
See implementation notes.

参见