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

瀏覽器相容性