Start · Sprachen · JavaScript · Referenz · Uint8ClampedArray

Uint8ClampedArray

Klasse

Typisiertes Array für 8-Bit-Ganzzahlen ohne Vorzeichen, bei dem Werte automatisch auf den Bereich 0–255 <em>geclampd</em> (begrenzt) werden.

seit JavaScript ES2015 Kategorie: core

Signatur

class Uint8ClampedArray extends TypedArray

Beschreibung

Uint8ClampedArray ist ein typisiertes Array, das jedes Element als vorzeichenlose 8-Bit-Ganzzahl (Byte) speichert. Im Gegensatz zu Uint8Array werden Werte außerhalb des Bereichs 0–255 nicht über Modulo-Arithmetik gewickelt, sondern geclampd: Werte kleiner als 0 werden auf 0 gesetzt, Werte größer als 255 auf 255. Dezimalzahlen werden dabei gerundet.

Der häufigste Einsatzbereich ist die Canvas-2D-API: ImageData.data ist ein Uint8ClampedArray, das die RGBA-Pixeldaten eines Canvas-Elements enthält. Jedes Pixel belegt vier aufeinanderfolgende Elemente (R, G, B, A). Das Clamping stellt sicher, dass ungültige Farbwerte nie in ungültige Byte-Werte verwandelt werden – ohne manuelle Überprüfung.

Wie alle typisierten Arrays basiert Uint8ClampedArray auf einem ArrayBuffer und bietet direkten, performanten Zugriff auf binäre Daten. Es unterstützt die üblichen Array-Methoden (map, filter, forEach usw.) sowie Slice- und Subarray-Operationen.

  • Elementgröße: 1 Byte pro Element (Uint8ClampedArray.BYTES_PER_ELEMENT === 1)
  • Wertebereich: 0–255 (geclampd, nicht gewickelt)
  • Runden: Dezimalwerte werden auf die nächste gerade Zahl gerundet (Banker's Rounding)

Parameter

Name Typ Default Beschreibung
$length number Anzahl der Elemente. Erstellt ein nullinitialisiertes Array mit der angegebenen Länge.
$typedArray TypedArray Ein anderes typisiertes Array, dessen Werte kopiert und geclampd werden.
$object ArrayLike|Iterable Ein array-ähnliches oder iterierbares Objekt, aus dem die Werte übernommen werden.
$buffer ArrayBuffer|SharedArrayBuffer Ein bestehender ArrayBuffer, auf dem das typisierte Array aufgesetzt wird.
$byteOffset number 0 Byte-Versatz im ArrayBuffer, ab dem das Array beginnt. Muss ein Vielfaches von BYTES_PER_ELEMENT (1) sein.
$length number Anzahl der Elemente im Array-View auf den ArrayBuffer.

Rückgabewert

Typ
Uint8ClampedArray
Beschreibung
Eine neue Uint8ClampedArray-Instanz.

Beispiele

Basis: Clamping-Verhalten

// Werte außerhalb 0–255 werden begrenzt
const arr = new Uint8ClampedArray([-10, 0, 128, 255, 300, 1.7, 1.5]);
console.log(arr[0]);  // 0   (negativ → 0)
console.log(arr[4]);  // 255 (> 255 → 255)
console.log(arr[5]);  // 2   (1.7 wird auf 2 gerundet)
console.log(arr[6]);  // 2   (1.5 → Banker's Rounding → 2)

// Vergleich mit Uint8Array (Wrapping)
const wrapped = new Uint8Array([300]);
console.log(wrapped[0]); // 44  (300 % 256 = 44)
console.log(arr[4]);     // 255 (geclampd)
0 255 2 2 44 255

Canvas-Pixelmanipulation: Bild aufhellen

const canvas = document.createElement('canvas');
canvas.width = 4;
canvas.height = 1;
const ctx = canvas.getContext('2d');

// Einen roten Pixel setzen
ctx.fillStyle = 'red';
ctx.fillRect(0, 0, 1, 1);

const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data; // Uint8ClampedArray

// Alle Pixel um 50 aufhellen (Alpha unberührt lassen)
for (let i = 0; i < data.length; i += 4) {
  data[i]     += 50; // R — Clamping auf 255 automatisch
  data[i + 1] += 50; // G
  data[i + 2] += 50; // B
  // data[i + 3] = Alpha, unveränderlich
}

ctx.putImageData(imageData, 0, 0);
console.log(data[0]); // R-Wert: war 255 (rot) + 50 → 255 (geclampd)
255

Fortgeschritten: Graustufen-Konvertierung mit map

// Hilfsfunktion: RGB → Graustufe (Luminanz-Formel)
const toGrayscale = (imageData) => {
  const src = imageData.data;
  const dst = new Uint8ClampedArray(src.length);

  for (let i = 0; i < src.length; i += 4) {
    const r = src[i];
    const g = src[i + 1];
    const b = src[i + 2];
    const lum = 0.299 * r + 0.587 * g + 0.114 * b; // kann > 255 sein → geclampd
    dst[i]     = lum;
    dst[i + 1] = lum;
    dst[i + 2] = lum;
    dst[i + 3] = src[i + 3]; // Alpha beibehalten
  }

  return new ImageData(dst, imageData.width, imageData.height);
};

// Verwendung:
// const gray = toGrayscale(ctx.getImageData(0, 0, w, h));
// ctx.putImageData(gray, 0, 0);
console.log('Uint8ClampedArray.BYTES_PER_ELEMENT:', Uint8ClampedArray.BYTES_PER_ELEMENT);
Uint8ClampedArray.BYTES_PER_ELEMENT: 1

// Wichtig · Fallstricke

Banker's Rounding (Runden zur nächsten geraden Zahl): Dezimalwerte mit exakt 0,5 als Nachkommasteil werden auf die nächste gerade Ganzzahl gerundet. new Uint8ClampedArray([0.5])[0] === 0, new Uint8ClampedArray([1.5])[0] === 2. Dieses Verhalten unterscheidet sich von Math.round.

Kein Wrapping: Anders als Uint8Array, Int8Array etc. wird bei Uint8ClampedArray kein Modulo-Wrapping durchgeführt. Das macht es sicher für Farbwert-Arithmetik ohne explizite Bereichsprüfungen.

Performance: Uint8ClampedArray ist für Canvas-Operationen optimiert. Bei intensiver Pixelmanipulation kann es sinnvoll sein, statt map/filter direkte Index-Schleifen zu verwenden.

Browser-Kompatibilität: Vollständig in allen modernen Browsern und Node.js unterstützt. ImageData akzeptiert Uint8ClampedArray direkt im Konstruktor ab Chrome 43, Firefox 29, Safari 8.