Ich verwende jsPDF und es verwendet html2canvas, um ein Bild aus einem HTML-Element zu generieren und in die PDF-Datei einzufügen. Aber es gibt ein Problem mit html2canvas, es erzeugt verschwommene Bilder aus dem HTML. Siehe Beispiel unten:
Gibt es eine Möglichkeit, das Problem zu beheben, oder gibt es eine bessere Option, um das HTML-Bildformular zu erhalten?
Danke!
Haben Sie überprüft, ob dies alle Webbrowser betrifft?
– Mikko Ohtamaa
2. April 14 um 9:44 Uhr
Ich würde versuchen, imageSmoothingEnabled auf false zu setzen (achten Sie auf Herstellerpräfixe).
– GameAlchemist
2. April 14 um 11:10 Uhr
Sie können verwenden Skala Optionen in html2canvas.
In der neuesten Version, v1.0.0-alpha.1, können Sie die Skalierungsoption verwenden, um die Auflösung zu erhöhen (Skalierung: 2 verdoppelt die Auflösung von den standardmäßigen 96 dpi).
// Create a canvas with double-resolution.
html2canvas(element, {
scale: 2,
onrendered: myRenderFunction
});
// Create a canvas with 144 dpi (1.5x resolution).
html2canvas(element, {
dpi: 144,
onrendered: myRenderFunction
});
dpi-Option wird in der neuesten Version nicht verwendet. Verwenden Sie daher Skalierung für Bilder in hoher Qualität
– Ricky Sharma
28. September 18 um 5:57 Uhr
Ich hatte dieses Problem, weil ich auf einem Retina-Display war. Ich habe es mit gelöst MisterLambs Lösung hier.
$(window).load(function () {
var scaleBy = 5;
var w = 1000;
var h = 1000;
var div = document.querySelector('#screen');
var canvas = document.createElement('canvas');
canvas.width = w * scaleBy;
canvas.height = h * scaleBy;
canvas.style.width = w + 'px';
canvas.style.height = h + 'px';
var context = canvas.getContext('2d');
context.scale(scaleBy, scaleBy);
html2canvas(div, {
canvas:canvas,
onrendered: function (canvas) {
theCanvas = canvas;
document.body.appendChild(canvas);
Canvas2Image.saveAsPNG(canvas);
$(body).append(canvas);
}
});
});
HTML und PNG ohne Skalierung
HTML und PNG mit Skalierung
Welche Version der html2canvas-Bibliothek verwenden Sie für diesen Fix?
Dies ist nicht die Art und Weise, wie es sein sollte. Ich mache eine 702-Größe in eine Breite von 800, aber wenn das Bild generiert wird, wird es kleiner und von der oberen und rechten Seite im Bild abgeschnitten.
– saadk
9. Februar 17 um 11:45 Uhr
@crclayton: Was ist auch der Unterschied zwischen “canvas.width” und “canvas.style.width”?
– saadk
9. Februar 17 um 11:55 Uhr
Ich habe das gleiche Problem wie Saadk.
– Kaleb Pitman
27. Juni 17 um 00:23 Uhr
Sulman Azhar
Ich stand vor diesem Problem und habe es mit gelöst domtoimage anstatt html2canvas.
Dies HTML2CANVAS Die Lösung funktionierte nicht gut für mich. Ich weiß, dass die Skalierungsoption die Größe des Ziel-Div erhöht, bevor sie erfasst wird, aber es funktioniert nicht, wenn Sie etwas in diesem Div haben, das die Größe nicht ändert, z. B. in meinem Fall war es eine Leinwand für mein Bearbeitungswerkzeug .
Jedenfalls habe ich mich dafür entschieden domtoimage und glauben Sie mir, ich denke, dass dies die beste Lösung von allen ist.
Ich hatte kein Problem mit html2canvas zum Beispiel:
müssen also oben auf der Webseite stehen html2canvas kann die Aufnahme vollständig erfassen und Probleme mit niedrigen dpi
function print()
{
var node = document.getElementById('shirtDiv');
var options = {
quality: 0.95
};
domtoimage.toJpeg(node, options).then(function (dataUrl)
{
var doc = new jsPDF();
doc.addImage(dataUrl, 'JPEG', -18, 20, 240, 134.12);
doc.save('Test.pdf');
});
}
Ihr Vorschlag von domtoimage hat für mich wie ein Zauber gewirkt. html2canvas war ein schrecklicher Schmerz. domtoimage hat das Pixelproblem gelöst. Vielen Dank 🙂
– Benutzer2909823
7. Oktober 21 um 16:34 Uhr
Ich habe mein Problem herausgefunden. Es kommt vor, dass mein Bildschirm ein Retina-Display ist. Wenn also canvas2html den HTML-Code rendert, wird das Bild aufgrund der unterschiedlichen Pixeldichte auf dem Retina-Bildschirm verschwommen gerendert.
Ändern Sie einfach die Methode getBounds() in html2canvas.js mit dieser:
function getBounds (node) {
if (node.getBoundingClientRect) {
var clientRect = node.getBoundingClientRect();
var width = node.offsetWidth == null ? clientRect.width : node.offsetWidth;
return {
top : Math.floor(clientRect.top),
bottom: Math.floor(clientRect.bottom || (clientRect.top + clientRect.height)),
right : Math.floor(clientRect.left + width),
left : Math.floor(clientRect.left),
width : width,
height: node.offsetHeight == null ? clientRect.height : node.offsetHeight
};
}
return {};
}
Beachten Sie, dass es, obwohl es es besser macht als das, was es war, es immer noch nicht vollständig perfekt macht.
– Shai UI
1. Feb. 16 um 16:28 Uhr
Die Lösung ist nach X Stunden Test sehr einfach.
Stellen Sie Ihre ALL div’s 2x höher, Ihr IMG 2x höher und stellen Sie schließlich den HTML-Zoom auf 0,5 ein, oder wenn Sie noch bessere Qualität wünschen, stellen Sie 3x höher (in diesem Fall muss der HTML-Zoom 0,33 sein) oder mehr ein (die ursprünglichen Bildgrößen werden größer angenommen).
Beachten Sie, dass es, obwohl es es besser macht als das, was es war, es immer noch nicht vollständig perfekt macht.
– Shai UI
1. Feb. 16 um 16:28 Uhr
Josua Becker
Wenn jemand immer noch nach einer Lösung sucht, um für ihn zu arbeiten, hatte ich Erfolg, indem ich die Skala eingestellt habe: 5. Überprüfen Sie es hier in seiner Dokumentation. https://html2canvas.hertzen.com/configuration
Haben Sie überprüft, ob dies alle Webbrowser betrifft?
– Mikko Ohtamaa
2. April 14 um 9:44 Uhr
Ich würde versuchen, imageSmoothingEnabled auf false zu setzen (achten Sie auf Herstellerpräfixe).
– GameAlchemist
2. April 14 um 11:10 Uhr