Javascript Canvas toBlob
canvas.toBlob erweitert die Techniken zum Umwandeln der Zeichnung im Canvas. Ein Blob kann als URL für ein a-Element oder als src-Attribut eines img-Tags eingesetzt werden und die Daten können dem Benutzer zum Download angeboten werden.
toDataURL / toBlob
Neben canvas.toDataUL ist canvas.toBlob eine weitere Methode, um die Zeichnung auf einem HTML-Canvas-Element festzuhalten und sie z.B. als PNG oder JPG zum Download anzubieten.
toBlob setzt als Argument eine Callback-Funktion, die den Blob erzeugt. Weitere Argumente sind der Mime-Type (PNG oder JPG), und falls ein JPG erzeugt werden soll, die Qualitätsstufe des JPGs.
canvas.toBlob(callback); canvas.toBlob(callback, MIME type); canvas.toBlob(callback, MIME type, JPEG quality level); callback(Blob)
Per Vorgabe erzeugt toBlob ein PNG.
Der Unterschied zwischen toBlob und toDataURL(): toDataURL ist synchron und blockiert die Benutzerschnittstelle (ähnlich wie ganz ganz früher der synchrone XHR), während canvas.toBlob die eigentliche Konvertierung in ein Bild asynchron durchführt.
Kriterium | canvas.toDataURL() | canvas.toBlob() |
---|---|---|
Ausgabeformat | Base64-String (data:image/png;base64,...) | Binäres Blob-Objekt |
Größe der Daten | Meist größer (wegen Base64-Overhead) | Effizienter (kleiner) |
Speichern / Upload | Umständlicher (Base64 muss konvertiert werden) | Direkt als Datei/Blob verwendbar |
Kompatibilität | Breite Unterstützung überall | Ältere Browser (< Edge 18) brauchen Fallback |
Performance | Langsamer bei großen Bildern | Schneller, asynchron |
Synchron / Async | Synchron (blockierend!) | Asynchron (besser für große Datenmengen) |
SVG mit einem canvas-Element als PNG laden
const svg = `<svg viewBox="0 0 800 480" width="800" height="500" xmlns="http://www.w3.org/2000/svg"> <path fill="#47383a" d="m349 … 58.7z"/> … // Canvas und Kontext abrufen var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); // Image-Element erzeugen var img = new Image(); // Data-URL aus SVG-Text var svgBlob = new Blob([svg], {type: 'image/svg+xml;charset=utf-8'}); var url = URL.createObjectURL(svgBlob); // Bild laden und auf dem canvas rendern dann Blob-URL freigeben img.onload = function() { ctx.drawImage(img, 0, 0); URL.revokeObjectURL(url); }; // src-Attribut auf Blob-URL setzen img.src = url;
URL.createObjectURL() erzeugt eine temporäre URL, die mit einem Blob oder einer Datei verknüpft ist. Am Ende noch den Download-Button initialisieren.
document.querySelector('#download').addEventListener('click', function() {
canvas.toBlob(function(blob) {
var link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'image.png';
link.click();
URL.revokeObjectURL(link.href);
}, 'image/png');
});
URL.revokeObjectURL() gibt eine zuvor mit URL.createObjectURL() erstellte Objekt-URL frei.