HTML内容:
html2canvas生成的图片:
有没有什么方法可以修复它,或者有没有更好的选项来从HTML中获取图像?谢谢!
html2canvas生成的图片:
有没有什么方法可以修复它,或者有没有更好的选项来从HTML中获取图像?您可以在html2canvas中使用缩放选项。
在最新的版本v1.0.0-alpha.1中,您可以使用scale选项来增加分辨率(scale:2将使分辨率加倍,默认为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
});
window.devicePixelRatio = 2;
- Patrik Kelemen因为我使用的是Retina显示器,所以遇到了这个问题。我通过MisterLamb在这里提供的解决方案解决了它。
$(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);
}
});
});
我曾经遇到过这个问题,但通过使用domtoimage
解决了它。之前用HTML2CANVAS
的方案对我不起作用,尽管有缩放选项可以在捕捉前增加目标div的大小,但如果该div内部有无法调整大小的元素,则此方法无效,例如在我的情况下,是编辑工具中的画布。
总之,我选择了domtoimage
,相信我,这是所有解决方案中最好的。
我没有遇到任何html2canvas
的问题,例如:
需要在网页顶部以便html2canvas
能够完全捕捉截图和低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');
});
}
将DOM转化为图像的CDN:
https://cdnjs.com/libraries/dom-to-image
用于jspdf的CDN:
解决方法非常简单,在经过X个小时的测试后。
将所有DIV的高度加倍,将IMG的高度加倍,最后将HTML缩放为0.5,或者如果你想要更好的质量,可以将它们设置为3倍高(在这种情况下,HTML缩放必须为0.33或更低),假设原始图像尺寸较大。
例如:
HTML
<body>
<div class="pdf">
<img src="image.jpg">
</div>
</body>
CSS之前
body {
background: #b2b2b2;
}
.pdf {
background: #fff;
/* A4 size */
width: 842px;
height: 595px;
}
img {
width: 300px;
height: 200px;
}
CSS after(仅更改)
html {
zoom: 0.5;
}
.pdf {
/* A4 size before . 2 */
width: 1684;
height: 1190px;
}
img { /* size before . 2 */
width: 600px;
height: 400px;
}
以下是我的结果:
https://github.com/cburgmer/rasterizeHTML.js/blob/master/examples/retina.html
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 {};
}
dom-to-image 库对我来说完美运作!
import domtoimage from "dom-to-image";
// Convert dom to image function
const exportAsImage = async (el, imageFileName) => {
domtoimage
.toPng(el)
.then(function (dataUrl) {
const image = dataUrl;
downloadImage(image, imageFileName);
})
.catch(function (error) {
console.error("oops, something went wrong!", error);
});
};
// dowload image function
const downloadImage = (blob, fileName) => {
const fakeLink = window.document.createElement("a");
fakeLink.style = "display:none;";
fakeLink.download = fileName;
fakeLink.href = blob;
document.body.appendChild(fakeLink);
fakeLink.click();
document.body.removeChild(fakeLink);
fakeLink.remove();
};
export default exportAsImage;
尝试使用Canvas2Image库,对我来说它可以提供更好质量的图像(fiddle中的div)。
html2canvas($("#widget"), {
onrendered: function(canvas) {
theCanvas = canvas;
Canvas2Image.saveAsPNG(canvas); // Convert and download as image with a prmompt.
}
});
祝你好运!