问题
I am using jsPDF and it uses html2canvas to generate an image from some html element and insert on the .pdf file. But there is a problem on html2canvas, it generates blurry images from the html. See example below:
HTML content:
http://puu.sh/7SZz4.png
html2canvas generated image:
http://puu.sh/7SZAT.png
Is there any way to fix it or is there any better option to get the image form html?
thanks!
回答1:
you can use scale options in html2canvas.
In the latest release, v1.0.0-alpha.1, you can use the scale option to increase the resolution (scale: 2 will double the resolution from the default 96dpi).
// 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
});
回答2:
I had this problem because I was on a retina display. I solved in by using MisterLamb's solution here.
$(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 and PNG without scaling
HTML and PNG with scaling
回答3:
I have found out my problem. Happens that my screen is a Retina Display, so when the canvas2html will render the HTML, due to the difference of pixel density on retina screen, the image is rendered blurred.
Found out the solution here:
https://github.com/cburgmer/rasterizeHTML.js/blob/master/examples/retina.html
回答4:
This is what fixed it for me. And it wasn't because I was using a retina display (because I don't have one):
https://github.com/niklasvh/html2canvas/issues/576
Just change the getBounds() method in html2canvas.js with this one:
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 {};
}
回答5:
Try the Canvas2Image library, it gives a better quality image at least for me div to image (fiddle).
html2canvas($("#widget"), {
onrendered: function(canvas) {
theCanvas = canvas;
Canvas2Image.saveAsPNG(canvas); // Convert and download as image with a prmompt.
}
});
Good luck!
来源:https://stackoverflow.com/questions/22803825/html2canvas-generates-blurry-images