ImageDecoder

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.

Note: This feature is available in Dedicated Web Workers.

Giao diện ImageDecoder của WebCodecs API cung cấp cách để giải nén và giải mã dữ liệu hình ảnh đã mã hóa.

Hàm khởi tạo

ImageDecoder()

Tạo một đối tượng ImageDecoder mới.

Thuộc tính phiên bản

ImageDecoder.complete Read only

Trả về một giá trị boolean cho biết dữ liệu đã mã hóa có được lưu vào bộ đệm hoàn toàn hay không.

ImageDecoder.completed Read only

Trả về một Promise được giải quyết khi complete là true.

ImageDecoder.tracks Read only

Trả về một đối tượng ImageTrackList liệt kê các track có sẵn và cung cấp phương thức để chọn một track cần giải mã.

ImageDecoder.type Read only

Trả về một chuỗi phản ánh kiểu MIME được cấu hình trong quá trình khởi tạo.

Phương thức tĩnh

ImageDecoder.isTypeSupported()

Cho biết liệu kiểu MIME được cung cấp có được hỗ trợ để giải nén và giải mã không.

Phương thức phiên bản

ImageDecoder.close()

Kết thúc tất cả công việc đang chờ và giải phóng tài nguyên hệ thống.

ImageDecoder.decode()

Thêm một thông điệp điều khiển vào hàng đợi để giải mã một khung của hình ảnh.

ImageDecoder.reset()

Hủy tất cả các thao tác decode() đang chờ.

Ví dụ

Với một phần tử <canvas>:

html
<canvas></canvas>

đoạn code sau đây giải mã và hiển thị một hình ảnh động lên 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));

Thông số kỹ thuật

Specification
WebCodecs
# imagedecoder-interface

Tương thích trình duyệt