ImageDecoder

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 专用 Web Workers 中可用。

ImageDecoder 接口是 WebCodecs API 的一部分,它提供了一种解包和解码编码图像数据的方式。

构造函数

ImageDecoder()

创建一个新的 ImageDecoder 对象。

实例属性

ImageDecoder.complete 只读

返回一个布尔值,指示编码数据是否已完全缓冲。

ImageDecoder.completed 只读

返回一个 Promise,当 complete 为 true 时解析。

ImageDecoder.tracks 只读

返回一个 ImageTrackList 对象,列出可用的轨道并提供选择要解码的轨道的方法。

ImageDecoder.type 只读

返回一个字符串,反映构造期间配置的 MIME 类型

静态方法

ImageDecoder.isTypeSupported()

指示提供的 MIME 类型 是否支持解包和解码。

实例方法

ImageDecoder.close()

结束所有待处理的工作并释放系统资源。

ImageDecoder.decode()

将解码图像帧的控制消息加入队列。

ImageDecoder.reset()

中止所有挂起的 decode() 操作。

示例

给定一个 <canvas> 元素

html
<canvas></canvas>

以下代码会将动画图像解码并渲染到该画布上

js
let imageDecoder = null;
let imageIndex = 0;

function renderImage(result) {
  const canvas = document.querySelector("canvas");
  const canvasContext = canvas.getContext("2d");

  canvasContext.drawImage(result.image, 0, 0);

  const track = imageDecoder.tracks.selectedTrack;

  // We check complete here since `frameCount` won't be stable until all
  // data has been received. This may cause us to receive a RangeError
  // during the decode() call below which needs to be handled.
  if (imageDecoder.complete) {
    if (track.frameCount === 1) return;

    if (imageIndex + 1 >= track.frameCount) imageIndex = 0;
  }

  // Decode the next frame ahead of display so it's ready in time.
  imageDecoder
    .decode({ frameIndex: ++imageIndex })
    .then((nextResult) =>
      setTimeout(() => {
        renderImage(nextResult);
      }, result.image.duration / 1000.0),
    )
    .catch((e) => {
      // We can end up requesting an imageIndex past the end since
      // we're using a ReadableStream from fetch(), when this happens
      // just wrap around.
      if (e instanceof RangeError) {
        imageIndex = 0;
        imageDecoder.decode({ frameIndex: imageIndex }).then(renderImage);
      } else {
        throw e;
      }
    });
}

function decodeImage(imageByteStream) {
  imageDecoder = new ImageDecoder({ data: imageByteStream, type: "image/gif" });
  imageDecoder.decode({ frameIndex: imageIndex }).then(renderImage);
}

fetch("fancy.gif").then((response) => decodeImage(response.body));

规范

规范
WebCodecs
# imagedecoder-interface

浏览器兼容性