Start · Sprachen · JavaScript · Referenz · ImageTrack.selected

ImageTrack.selected

Eigenschaft

Boolesche Eigenschaft, die angibt, ob eine <code>ImageTrack</code> gerade zum Dekodieren ausgewählt ist. Wenn du sie setzt, wählst du damit eine andere Spur aus.

seit JavaScript Chrome/Edge 94+, Firefox 133+; nicht in Safari (We Kategorie: webapi

Signatur

ImageTrack.selected

Beschreibung

Die Eigenschaft selected gehört zum Interface ImageTrack aus der WebCodecs-API. Eine Bilddatei kann mehrere Spuren enthalten, zum Beispiel ein Standbild und zusätzlich eine animierte Sequenz, wie es bei manchen AVIF-Dateien der Fall ist. Ein ImageDecoder dekodiert immer nur die Spur, deren selected-Wert true ist. Alle Aufrufe von decode() gelten also für diese Spur.

Du kannst die Eigenschaft lesen und schreiben. Setzt du sie auf true, wird diese Spur ausgewählt und die bisher ausgewählte Spur verliert ihre Auswahl, denn es kann immer nur eine Spur ausgewählt sein. Setzt du die ausgewählte Spur auf false, ist anschließend keine Spur mehr ausgewählt: ImageTrackList.selectedIndex ist dann -1, und decode() schlägt fehl, bis du wieder eine Spur auswählst.

Typische Einsatzfälle sind das Umschalten zwischen Standbild und Animation, eine gezielte Auswahl der Spur mit den meisten Frames oder die Prüfung, welche Spur der Decoder standardmäßig ausgewählt hat. Die Spurliste ist erst gültig, nachdem das Promise decoder.tracks.ready erfüllt wurde.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn die Spur zum Dekodieren ausgewählt ist, sonst false. Wenn du den Wert setzt, änderst du die Auswahl im zugehörigen ImageDecoder.

Beispiele

Ausgewählte Spur einer Bilddatei ermitteln

const response = await fetch('/bilder/animation.avif');
const decoder = new ImageDecoder({
  data: response.body,
  type: 'image/avif'
});

// Die Spurliste erst nach tracks.ready verwenden
await decoder.tracks.ready;

for (let i = 0; i < decoder.tracks.length; i++) {
  const track = decoder.tracks[i];
  console.log(`Spur ${i}: animiert=${track.animated}, ausgewählt=${track.selected}`);
}
Spur 0: animiert=false, ausgewählt=false Spur 1: animiert=true, ausgewählt=true

Auf die Standbild-Spur umschalten und dekodieren

const response = await fetch('/bilder/animation.avif');
const decoder = new ImageDecoder({ data: response.body, type: 'image/avif' });
await decoder.tracks.ready;

// Erste nicht animierte Spur suchen
const standbild = Array.from(
  { length: decoder.tracks.length },
  (_, i) => decoder.tracks[i]
).find((track) => !track.animated);

if (standbild && !standbild.selected) {
  standbild.selected = true; // hebt die Auswahl der anderen Spur auf
}

const { image } = await decoder.decode({ frameIndex: 0 });
const canvas = document.querySelector('canvas');
canvas.getContext('2d').drawImage(image, 0, 0);
image.close();
console.log('Ausgewählte Spur:', decoder.tracks.selectedIndex);
Ausgewählte Spur: 0

Auswahl aufheben und wiederherstellen

const response = await fetch('/bilder/animiert.gif');
const decoder = new ImageDecoder({ data: response.body, type: 'image/gif' });
await decoder.tracks.ready;

const track = decoder.tracks.selectedTrack;
track.selected = false;
console.log(decoder.tracks.selectedIndex); // keine Spur mehr ausgewählt

try {
  await decoder.decode();
} catch (err) {
  console.log('Dekodieren fehlgeschlagen:', err.name);
}

track.selected = true;
console.log(decoder.tracks.selectedIndex);
-1 Dekodieren fehlgeschlagen: InvalidStateError 0

// Wichtig · Fallstricke

  • Browserunterstützung: ImageDecoder gibt es in Chromium-Browsern ab Version 94 und in Firefox ab Version 133, aber nicht in Safari. Prüfe die Unterstützung vorher mit 'ImageDecoder' in window. Die API steht nur in sicheren Kontexten (HTTPS) zur Verfügung, dafür aber auch in Web Workern.
  • Zeitpunkt: Lies oder setze selected erst nach await decoder.tracks.ready. Vorher ist die Spurliste möglicherweise leer.
  • Nur eine Auswahl: Setzt du eine Spur auf true, verlieren alle anderen Spuren automatisch ihre Auswahl. Setzt du die aktive Spur auf false, ist keine Spur mehr ausgewählt, und decode() wird abgelehnt.
  • Laufende Dekodierungen: Beim Wechsel der Spur werden noch ausstehende decode()-Promises abgelehnt. Starte die Dekodierung erst nach dem Umschalten.
  • Geschlossener Decoder: Nach decoder.close() hat das Setzen von selected keine Wirkung.
  • ImageDecoder.isTypeSupported(type) sagt dir, ob der Browser ein Format (etwa AVIF) überhaupt dekodieren kann.