Start · Sprachen · JavaScript · Referenz · ImageData.colorSpace

ImageData.colorSpace

Eigenschaft

Schreibgeschützte Eigenschaft, die den Farbraum eines <code>ImageData</code>-Objekts als String liefert: <code>"srgb"</code> oder <code>"display-p3"</code>.

seit JavaScript Chrome 92+, Firefox 134+, Safari 15.2+ Kategorie: webapi

Signatur

ImageData.colorSpace

Beschreibung

Die Eigenschaft ImageData.colorSpace gibt an, in welchem Farbraum die Pixelwerte im Array ImageData.data vorliegen. Mögliche Werte sind "srgb" (Standard-Farbraum des Webs) und "display-p3" (größerer Farbraum für Wide-Gamut-Displays, etwa bei aktuellen Apple-Geräten).

Welcher Farbraum gilt, legst du beim Erzeugen fest: entweder über die Option colorSpace im Konstruktor new ImageData(width, height, { colorSpace }), über CanvasRenderingContext2D.createImageData() oder getImageData() mit derselben Option. Ohne Angabe übernimmt getImageData() den Farbraum des Canvas-Kontexts, den du mit canvas.getContext("2d", { colorSpace: "display-p3" }) einstellen kannst.

Wichtig ist die Eigenschaft, wenn du Pixeldaten direkt bearbeitest oder zwischen Canvas-Elementen austauschst. Die gleichen RGBA-Bytes stehen in "display-p3" für andere, teils sattere Farben als in "srgb". Schreibst du Daten mit putImageData() in einen Kontext mit anderem Farbraum, rechnet der Browser sie um. Dabei können Farben aus dem größeren Farbraum verloren gehen.

Rückgabewert

Typ
"srgb" | "display-p3"
Beschreibung
Ein String mit dem Farbraum der Bilddaten. Die Eigenschaft ist schreibgeschützt. Der Wert wird beim Erzeugen des Objekts festgelegt und lässt sich danach nicht mehr ändern.

Beispiele

Farbraum eines neuen ImageData-Objekts auslesen

// Standard: sRGB
const standard = new ImageData(10, 10);
console.log(standard.colorSpace);

// Display P3 explizit anfordern
const p3 = new ImageData(10, 10, { colorSpace: "display-p3" });
console.log(p3.colorSpace);
srgb display-p3

Farbraum vom Canvas-Kontext übernehmen

const canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 100;

const ctx = canvas.getContext("2d", { colorSpace: "display-p3" });
ctx.fillStyle = "color(display-p3 1 0 0)"; // sattes P3-Rot
ctx.fillRect(0, 0, 100, 100);

// Ohne Option erbt getImageData den Farbraum des Kontexts
const pixels = ctx.getImageData(0, 0, 1, 1);
console.log(pixels.colorSpace, [...pixels.data]);

// Oder gezielt in sRGB umgerechnet auslesen
const srgbPixels = ctx.getImageData(0, 0, 1, 1, { colorSpace: "srgb" });
console.log(srgbPixels.colorSpace, [...srgbPixels.data]);
display-p3 [255, 0, 0, 255] srgb [255, 0, 0, 255] // P3-Rot wird auf den sRGB-Rand abgeschnitten

Mit Feature-Erkennung auf Wide Gamut prüfen

const supportsP3 = () => {
  try {
    const img = new ImageData(1, 1, { colorSpace: "display-p3" });
    return img.colorSpace === "display-p3";
  } catch {
    return false;
  }
};

const wideGamutScreen = matchMedia("(color-gamut: p3)").matches;
const colorSpace = supportsP3() && wideGamutScreen ? "display-p3" : "srgb";
console.log(`Verwende Farbraum: ${colorSpace}`);
Verwende Farbraum: display-p3 // auf P3-fähigem Gerät, sonst srgb

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie img.colorSpace = "display-p3" wird ignoriert, im Strict Mode gibt es einen TypeError. Um den Farbraum zu wechseln, musst du ein neues ImageData-Objekt erzeugen oder die Daten erneut mit getImageData(..., { colorSpace }) auslesen.
  • Keine Umrechnung der Bytes: Die Eigenschaft beschreibt nur, wie die Bytes in data zu deuten sind. Übergibst du ein bestehendes Uint8ClampedArray an new ImageData(data, w, h, { colorSpace }), werden die Werte nicht umgerechnet, sondern nur anders gedeutet.
  • Verlust beim Umrechnen: Bei putImageData() in einen Kontext mit anderem Farbraum rechnet der Browser um. Von P3 nach sRGB werden Farben außerhalb des sRGB-Bereichs abgeschnitten.
  • Genauigkeit: Pro Kanal gibt es weiterhin nur 8 Bit. Bei P3 sind die Farbabstufungen deshalb gröber als bei sRGB, und bei Verläufen kann Banding auftreten.
  • Kompatibilität: Chromium-Browser und Safari unterstützen die Eigenschaft seit Längerem, Firefox erst seit neueren Versionen. Ältere Browser kennen die Eigenschaft nicht (undefined) und ignorieren die Option colorSpace. Prüfe das per Feature-Erkennung. Ein unbekannter Wert wie "rec2020" löst einen TypeError aus.