Signatur
Beschreibung
Die Methode createImageData() erzeugt einen leeren Pixelpuffer vom Typ ImageData. Seine Eigenschaft data ist ein Uint8ClampedArray mit width × height × 4 Einträgen, jeweils ein Byte für Rot, Grün, Blau und Alpha. Anfangs sind alle Werte 0, das Bild ist also vollständig transparent.
Es gibt zwei Aufrufvarianten:
- Mit Breite und Höhe: Das Objekt bekommt genau diese Maße.
- Mit einem vorhandenen
ImageData-Objekt: Nur dessen Maße werden übernommen. Die Pixeldaten werden nicht kopiert, das neue Objekt ist leer.
Die Methode eignet sich, wenn du Pixel selbst berechnest, zum Beispiel für Rauschen, Farbverläufe, Fraktale, Bildfilter oder das Ergebnis einer Faltung. Mit putImageData() überträgst du das Ergebnis danach auf den Canvas. Um vorhandene Canvas-Inhalte auszulesen, verwendest du dagegen getImageData().
Das Objekt hängt nicht am Kontext. Du kannst es also mehrfach wiederverwenden. Gleichwertig ist der Konstruktor new ImageData(width, height), der auch ohne Canvas-Kontext funktioniert, etwa in Web Workern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $width Pflicht | number | Breite des neuen ImageData-Objekts in Pixeln. Negative Werte werden als Betrag behandelt, 0 löst einen IndexSizeError aus. |
|
| $height Pflicht | number | Höhe in Pixeln. Es gelten dieselben Regeln wie bei width. |
|
| $settings | { colorSpace?: 'srgb' | 'display-p3' } | { colorSpace: 'srgb' } | Optionale Einstellungen. Mit colorSpace legst du den Farbraum der Pixeldaten fest. |
| $imagedata | ImageData | Alternative Aufrufvariante: ein vorhandenes ImageData-Objekt, dessen width und height übernommen werden. Die Pixeldaten werden nicht kopiert. |
Rückgabewert
ImageData-Objekt mit den angegebenen Maßen. Alle Pixel sind transparentes Schwarz.Beispiele
Leeres ImageData erzeugen und untersuchen
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const img = ctx.createImageData(100, 50);
console.log(img.width, img.height); // Maße
console.log(img.data.length); // 100 * 50 * 4
console.log(img.data[0], img.data[3]); // Alle Werte sind 0
Zufallsrauschen pixelweise zeichnen
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
const { width, height } = canvas;
const img = ctx.createImageData(width, height);
const px = img.data;
for (let i = 0; i < px.length; i += 4) {
const v = Math.random() * 255 | 0;
px[i] = v; // Rot
px[i + 1] = v; // Grün
px[i + 2] = v; // Blau
px[i + 3] = 255; // Alpha: voll deckend
}
ctx.putImageData(img, 0, 0);
Graustufenfilter mit gleich großem Zielpuffer
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
const src = ctx.getImageData(0, 0, canvas.width, canvas.height);
// Übernimmt nur die Maße, die Pixel bleiben leer
const dst = ctx.createImageData(src);
for (let i = 0; i < src.data.length; i += 4) {
const [r, g, b, a] = src.data.subarray(i, i + 4);
const grau = 0.299 * r + 0.587 * g + 0.114 * b;
dst.data[i] = dst.data[i + 1] = dst.data[i + 2] = grau;
dst.data[i + 3] = a;
}
ctx.putImageData(dst, 0, 0);
Farbverlauf mit Koordinatenberechnung
const ctx = document.querySelector('canvas').getContext('2d');
const w = 256, h = 64;
const img = ctx.createImageData(w, h);
for (let y = 0; y < h; y++) {
for (let x = 0; x < w; x++) {
const i = (y * w + x) * 4; // Index des Pixels (x, y)
img.data[i] = x; // Rot steigt nach rechts an
img.data[i + 2] = 255 - x; // Blau nimmt ab
img.data[i + 3] = 255;
}
}
ctx.putImageData(img, 10, 10);
// Wichtig · Fallstricke
- Keine Kopie der Pixel:
createImageData(vorhandenesImageData)übernimmt nur die Maße. Eine echte Kopie erzeugst du mitnew ImageData(new Uint8ClampedArray(src.data), src.width). - Transparent statt schwarz: Wenn du nur RGB setzt und den Alphawert auf
0lässt, bleibt das Ergebnis unsichtbar. Setze deshalbdata[i + 3] = 255. - putImageData ignoriert den Zeichenzustand: Transformationen,
globalAlpha,globalCompositeOperationund Clipping-Bereiche wirken nicht. Die Pixel werden 1:1 übernommen, ohne Alpha-Überblendung. - Fehler: Ist
widthoderheightgleich0, wird einIndexSizeErrorausgelöst. Sehr große Maße können einenRangeErrorauslösen, weil der Speicher nicht reicht (4 Byte pro Pixel). - Performance: Lege den Puffer in Animationsschleifen einmal an und verwende ihn weiter, statt ihn in jedem Frame neu zu erzeugen. Für schnelle Schreibzugriffe kannst du über
new Uint32Array(img.data.buffer)ganze Pixel auf einmal setzen. Beachte dabei die Byte-Reihenfolge (auf den meisten Systemen Little-Endian, also ABGR). - Hohe Pixeldichte: Die Maße gelten in Gerätepixeln des Canvas-Puffers, nicht in CSS-Pixeln. Rechne
devicePixelRatiogegebenenfalls selbst ein. - Kompatibilität: Die Methode wird von allen Browsern unterstützt, auch von
OffscreenCanvasRenderingContext2D. Der ParametersettingsmitcolorSpace: 'display-p3'ist neuer und wird noch nicht überall unterstützt.