Signatur
Beschreibung
Der Konstruktor new Image() erzeugt ein neues HTMLImageElement, das noch nicht im Dokument hängt. Das Ergebnis ist dasselbe wie bei document.createElement('img'). Optional kannst du gleich Breite und Höhe mitgeben. Sie werden als HTML-Attribute width und height gesetzt.
Typische Einsatzfälle sind das Vorladen von Bildern (Preloading), das Laden von Bildern zum Zeichnen in ein <canvas>, das Auslesen der natürlichen Bildmaße über naturalWidth/naturalHeight und einfache Tracking-Pixel. Sobald du src setzt, beginnt der Browser mit dem Laden, auch wenn das Element nie ins DOM eingefügt wird.
Ob das Laden fertig ist, erfährst du über die Events load und error oder mit der Promise-basierten Methode decode(). Diese löst erst auf, wenn das Bild dekodiert ist und ohne Ruckeln angezeigt werden kann.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $width | number | Breite des Bildes in CSS-Pixeln. Wird als Attribut width gesetzt. |
|
| $height | number | Höhe des Bildes in CSS-Pixeln. Wird als Attribut height gesetzt. |
Rückgabewert
<img>-Element.Beispiele
Bild erzeugen und ins DOM einfügen
const img = new Image(200, 120);
img.src = '/bilder/logo.png';
img.alt = 'Firmenlogo';
document.body.append(img);
console.log(img.outerHTML);
Bild als Promise laden (Preloading)
const loadImage = (url) => new Promise((resolve, reject) => {
const img = new Image();
img.onload = () => resolve(img);
img.onerror = () => reject(new Error(`Bild konnte nicht geladen werden: ${url}`));
img.src = url; // src erst NACH den Handlern setzen
});
const main = async () => {
try {
const img = await loadImage('/bilder/foto.jpg');
console.log(`Geladen: ${img.naturalWidth}×${img.naturalHeight}`);
} catch (err) {
console.error(err.message);
}
};
main();
Bild mit decode() in ein Canvas zeichnen
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
const drawImage = async (url) => {
const img = new Image();
img.crossOrigin = 'anonymous'; // nötig, damit das Canvas nicht "tainted" wird
img.src = url;
await img.decode();
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
ctx.drawImage(img, 0, 0);
console.log('Gezeichnet');
};
drawImage('https://cdn.example.com/karte.png');
Mehrere Bilder parallel vorladen
const urls = ['/img/a.jpg', '/img/b.jpg', '/img/c.jpg'];
const preloadAll = (list) => Promise.all(
list.map((url) => {
const img = new Image();
img.src = url;
return img.decode().then(() => img);
})
);
preloadAll(urls).then((images) => console.log(`${images.length} Bilder bereit`));
// Wichtig · Fallstricke
- Reihenfolge: Hänge die Handler
onload/onerroran, bevor dusrcsetzt. Kommt das Bild aus dem Cache, kann das Event sonst schon gefeuert haben, bevor der Handler hängt. - Kein Laden ohne
src: Ohnesrc(odersrcset) passiert nichts.decode()wird dann mit einerEncodingError-DOMException abgelehnt, ebenso bei defekten Bilddaten. - Canvas und CORS: Zeichnest du Bilder von fremden Origins ohne
crossOrigin = 'anonymous'und passendenAccess-Control-Allow-Origin-Header ins Canvas, wird das Canvas „tainted“. Dann werfengetImageData()undtoDataURL()einenSecurityError. - Maße:
width/heightaus dem Konstruktor legen nur die Darstellungsgröße fest. Die echten Pixelmaße liefernnaturalWidth/naturalHeight, und zwar erst nach dem Laden. - Sicherheit: Setze nicht ungeprüft Adressen aus Benutzereingaben als
src. Sonst können unerwünschte Anfragen ausgelöst werden, etwa Tracking oder Anfragen an interne Adressen. Die CSP-Direktiveimg-srcschränkt ein, von welchen Quellen Bilder geladen werden dürfen. - Nur im Browser: Der Konstruktor steht nur im Fenster-Kontext zur Verfügung, also nicht in Web Workern und nicht in Node.js. Im Worker verwendest du
fetch()zusammen mitcreateImageBitmap().