Start · Sprachen · JavaScript · Referenz · WorkerGlobalScope.createImageBitmap()

WorkerGlobalScope.createImageBitmap()

Methode

Erzeugt in einem Worker asynchron ein <code>ImageBitmap</code> aus einer Bildquelle; optional wird nur ein Ausschnitt übernommen und das Ergebnis skaliert oder anders umgewandelt.

seit JavaScript Baseline: alle modernen Browser (Safari ab 15) Kategorie: webapi

Signatur

WorkerGlobalScope.createImageBitmap(image, sx?, sy?, sw?, sh?, options?)

Beschreibung

createImageBitmap() steht in Workern als globale Funktion bereit (self.createImageBitmap()). Die Methode dekodiert eine Bildquelle, etwa einen Blob, ein ImageData, ein OffscreenCanvas, ein VideoFrame oder ein vorhandenes ImageBitmap, und liefert ein Promise, das mit einem ImageBitmap erfüllt wird. Dieses Bitmap lässt sich ohne Verzögerung auf ein OffscreenCanvas zeichnen oder als WebGL-Textur hochladen.

Die Methode eignet sich vor allem dafür, das aufwendige Dekodieren von Bildern aus dem Haupt-Thread herauszuhalten. Typische Fälle sind Bildergalerien, Thumbnail-Erzeugung, Spiele mit vielen Texturen und Bildverarbeitung in einem OffscreenCanvas. Ein ImageBitmap ist ein übertragbares Objekt (Transferable). Du kannst es also per postMessage() ohne Kopie an den Haupt-Thread zurückgeben.

Mit den optionalen Parametern sx, sy, sw und sh legst du einen Ausschnitt der Quelle fest. Über options steuerst du Skalierung (resizeWidth/resizeHeight, resizeQuality), vertikale Spiegelung (imageOrientation), Vormultiplikation des Alphakanals (premultiplyAlpha) und Farbraum-Umwandlung (colorSpaceConversion).

Im Worker gibt es kein DOM. Die Quellen HTMLImageElement, HTMLVideoElement, HTMLCanvasElement und SVGImageElement fallen dort also weg. Bilder lädst du stattdessen per fetch() als Blob.

Parameter

Name Typ Default Beschreibung
$image Pflicht Blob | ImageData | ImageBitmap | OffscreenCanvas | VideoFrame Die Bildquelle. Im Worker sind nur Quellen ohne DOM-Bezug möglich.
$sx number x-Koordinate der linken oberen Ecke des Ausschnitts. Gibst du einen Ausschnitt an, sind alle vier Werte sx, sy, sw und sh Pflicht.
$sy number y-Koordinate der linken oberen Ecke des Ausschnitts.
$sw number Breite des Ausschnitts in Pixeln. Der Wert darf nicht 0 sein. Negative Werte spiegeln den Ausschnitt in die andere Richtung.
$sh number Höhe des Ausschnitts in Pixeln. Der Wert darf nicht 0 sein.
$options object {} Optionen:
  • imageOrientation: "from-image" (Standard; ältere Browser verwenden "none") oder "flipY"
  • premultiplyAlpha: "default", "none" oder "premultiply"
  • colorSpaceConversion: "default" oder "none"
  • resizeWidth / resizeHeight: Zielgröße in Pixeln (number)
  • resizeQuality: "pixelated", "low" (Standard), "medium" oder "high"

Rückgabewert

Typ
Promise<ImageBitmap>
Beschreibung
Ein Promise, das mit dem erzeugten ImageBitmap erfüllt wird. Es wird abgelehnt, wenn die Quelle ungültig ist oder nicht dekodiert werden kann (InvalidStateError, InvalidStateError/EncodingError bei defekten Daten), wenn sw oder sh gleich 0 ist (RangeError) oder wenn der Typ der Quelle nicht unterstützt wird (TypeError).

Beispiele

Bild im Worker laden, dekodieren und an den Haupt-Thread übertragen

// worker.js
self.addEventListener('message', async (event) => {
  const response = await fetch(event.data.url);
  const blob = await response.blob();
  const bitmap = await createImageBitmap(blob);
  // Ohne Kopie übertragen (Transferable)
  self.postMessage({ bitmap }, [bitmap]);
});

// main.js
const worker = new Worker('worker.js');
worker.addEventListener('message', ({ data }) => {
  const ctx = document.querySelector('canvas').getContext('2d');
  ctx.drawImage(data.bitmap, 0, 0);
  console.log(`Bitmap: ${data.bitmap.width}×${data.bitmap.height}`);
  data.bitmap.close();
});
worker.postMessage({ url: '/img/foto.jpg' });
Bitmap: 1920×1080

Thumbnail mit Ausschnitt und Skalierung erzeugen

// worker.js – quadratisches 200×200-Thumbnail aus der Bildmitte
const makeThumbnail = async (blob) => {
  const full = await createImageBitmap(blob);
  const side = Math.min(full.width, full.height);
  const sx = (full.width - side) / 2;
  const sy = (full.height - side) / 2;
  full.close();

  const thumb = await createImageBitmap(blob, sx, sy, side, side, {
    resizeWidth: 200,
    resizeHeight: 200,
    resizeQuality: 'high'
  });

  const canvas = new OffscreenCanvas(200, 200);
  canvas.getContext('2d').drawImage(thumb, 0, 0);
  thumb.close();
  return canvas.convertToBlob({ type: 'image/webp', quality: 0.8 });
};

self.onmessage = async ({ data }) => {
  const thumbBlob = await makeThumbnail(data.file);
  self.postMessage(thumbBlob);
};

Pixeldaten bearbeiten und als Bitmap zurückgeben

// worker.js – Graustufen-Filter über ImageData
const toGrayscale = async (imageData) => {
  const { data } = imageData;
  for (let i = 0; i < data.length; i += 4) {
    const g = 0.299 * data[i] + 0.587 * data[i + 1] + 0.114 * data[i + 2];
    data[i] = data[i + 1] = data[i + 2] = g;
  }
  return createImageBitmap(imageData);
};

const demo = new ImageData(new Uint8ClampedArray([255, 0, 0, 255]), 1, 1);
toGrayscale(demo).then((bmp) => console.log(bmp.width, bmp.height));
1 1

Fehlerbehandlung bei ungültigen Bilddaten

// worker.js
const safeDecode = async (blob) => {
  try {
    return await createImageBitmap(blob);
  } catch (err) {
    console.warn(`Dekodierung fehlgeschlagen: ${err.name}`);
    return null;
  }
};

safeDecode(new Blob(['kein Bild'], { type: 'image/png' }))
  .then((result) => console.log(result));
Dekodierung fehlgeschlagen: InvalidStateError null