用dom-to-image将html生成图片
由于业务需要,要将html
的表格转成图片下载下来,一开始使用的是html2canvas.js
。功能是可以实现,但是有缺陷(表格存在合并的单元格时,生成的图片表格线框不完整),后来很不容易知道了dom-to-image.js
,尝试之后觉得非常不错。
废话不多说,开搞。
第一步:下载必要的js库
① jquery库(不使用jquery的就算了,要的自己能找到的):
②dom-to-image.js:这里写链接内容
③FileSaver.js:这里写链接内容
第二步:新建html,引用第一步的几个库
第三步:实现生成图片
①生成png的图片插入的到当前页面
var node = document.getElementById('my-node');
domtoimage.toPng(node)
.then(function (dataUrl) {
var img = new Image();
img.src = dataUrl;
document.body.appendChild(img);
})
.catch(function (error) {
console.error('oops, something went wrong!', error);
});
②生成图片并下载png格式
domtoimage.toBlob(document.getElementById('my-node'))
.then(function (blob) {
window.saveAs(blob, 'my-node.png');
});
③生成图片并下载jpeg格式
domtoimage.toJpeg(document.getElementById('my-node'), { quality: 0.95 })
.then(function (dataUrl) {
var link = document.createElement('a');
link.download = 'my-image-name.jpeg';
link.href = dataUrl;
link.click();
});
④还两种生成SVG
和pixel data
的
domtoimage.toSvg(document.getElementById('my-node'), { filter: filter})
.then(function (dataUrl) {
/* do something */
});
var node = document.getElementById('my-node');
domtoimage.toPixelData(node)
.then(function (pixels) {
for (var y = 0; y < node.scrollHeight; ++y) {
for (var x = 0; x < node.scrollWidth; ++x) {
pixelAtXYOffset = (4 * y * node.scrollHeight) + (4 * x);
/* pixelAtXY is a Uint8Array[4] containing RGBA values of the pixel at (x, y) in the range 0..255 */
pixelAtXY = pixels.slice(pixelAtXYOffset, pixelAtXYOffset + 4);
}
}
});
完整的Demo:
<html>
<head>
<script type="text/javascript" src="jquery-1.11.2.min.js"></script>
<script type="text/javascript" src="dom-to-image.js"></script>
<script type="text/javascript" src="FileSaver.js"></script>
<script type="text/javascript"> $(function(){ // $("#btn").click(function(){ // 插入图片到html // var node = document.getElementById('table'); // domtoimage.toPng(node) // .then(function (dataUrl) { // var img = new Image(); // img.src = dataUrl; // document.body.appendChild(img); // }); // 下载png图片 domtoimage.toBlob(document.getElementById('table')) .then(function (blob) { window.saveAs(blob, 'my-node.png'); }); // 下载jpeg图片 // domtoimage.toJpeg(document.getElementById('my-node'), { quality: 0.95 }) // .then(function (dataUrl) { // var link = document.createElement('a'); // link.download = 'my-image-name.jpeg'; // link.href = dataUrl; // link.click(); // }); // var node = document.getElementById('table'); // domtoimage.toPixelData(node) // .then(function (pixels) { // for (var y = 0; y < node.scrollHeight; ++y) { // for (var x = 0; x < node.scrollWidth; ++x) { // pixelAtXYOffset = (4 * y * node.scrollHeight) + (4 * x); // /* pixelAtXY is a Uint8Array[4] containing RGBA values of the pixel at (x, y) in the range 0..255 */ // pixelAtXY = pixels.slice(pixelAtXYOffset, pixelAtXYOffset + 4); // } // } // }); }) </script>
</head>
<body>
<input type="button" id="btn" value="do it" />
<h4>两行三列:</h4>
<table id="table" border="1" style="width:200px;border-collapse: collapse;border:1px solid black;">
<tr style="background:green;">
<td rowspan="3">200</td>
<td>200</td>
<td>300</td>
</tr>
<tr style="background:green;">
<td rowspan="2">500</td>
<td>600</td>
</tr>
<tr style="background:green;">
<td>600</td>
</tr>
<tr style="background:skyblue;">
<td rowspan="3">100</td>
<td>200</td>
<td>300</td>
</tr>
<tr style="background:skyblue;">
<td>500</td>
<td>600</td>
</tr>
<tr style="background:skyblue;">
<td>600</td>
<td>600</td>
</tr>
</table>
</body>
</html>
dom-to-image
实现的网页截图
dom-to-image
如何使用请参考https://blog.csdn.net/u012260672/article/details/79302465
下面我们就不废话了直接上演示:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>echarts 测试</title>
<script type="text/javascript" src="dom-to-image.js"></script>
</head>
<body style="position:relative;">
<div style="width:100px;height:100px;background-color:#000;color:white;">
尾气请问气味哦平均气温哦啤酒去i
</div>
<div style="width:100px;height:100px;background-color:#ccc;"></div>
<div style="width:100px;height:100px;background-color:#666;color:#ccc;">
请我陪考去请问哦
</div>
<div style="width:100px;height:100px;background-color:#000;color:white;">
尾气请问气味哦平均气温哦啤酒去i
</div>
<div style="width:100px;height:100px;background-color:#ccc;"></div>
<div style="width:100px;height:100px;background-color:#000;color:white;">
尾气请问气味哦平均气温哦啤酒去i
</div>
<div style="width:100px;height:100px;background-color:#ccc;"></div>
<div style="width:100px;height:100px;background-color:#ddd;"></div>
<div style="width:900px;height:100px;background-color:#666;">
桥文件额期望寄哦IQ叫我我就群殴我为奇偶去叫哦我IQ寄哦
</div>
<div οnclick="jt()">点击截图</div>
<script> var pointInfo= { }; document.οnmοusedοwn=function(e){ if(!pointInfo.bool)return; pointInfo.startInfo={ x:e.clientX+window.scrollX, y:e.clientY+window.scrollY }; pointInfo.eleArr[1].style.left=e.clientX+window.scrollX+"px"; pointInfo.eleArr[1].style.top=e.clientY+window.scrollY+"px"; } document.οnmοusemοve=function(e){ if(!pointInfo.bool)return; if(!pointInfo.startInfo)return; pointInfo.eleArr[1].style.width=e.clientX-pointInfo.startInfo.x+window.scrollX+"px"; pointInfo.eleArr[1].style.height=e.clientY-pointInfo.startInfo.y+window.scrollY+"px"; } document.οnmοuseup=function(e){ if(!pointInfo.bool)return; if(!pointInfo.startInfo)return; pointInfo.bool=false; var c = document.createElement("canvas"); node=document.body; document.body.removeChild( pointInfo.eleArr[0]); var promise = domtoimage.toPng(node); promise.then(function(v){ var img =new Image(); img.src=v; c.width=parseInt(pointInfo.eleArr[1].style.width); c.height=parseInt(pointInfo.eleArr[1].style.height); var ctx = c.getContext("2d"); img.οnlοad=function(){ ctx.drawImage(img,pointInfo.startInfo.x,pointInfo.startInfo.y,c.width,c.height,0,0,c.width,c.height); var imgS=document.createElement("img"); imgS.src=c.toDataURL(); document.body.appendChild(imgS); pointInfo.startInfo=null; } }); } function jt(){ var d= document.createElement("div"); var d2=document.createElement("div"); d.style.cssText="width:100%;height:100%;background-color:rgba(0,0,0,0.2);position:absolute;top:0;left:0;"; d2.style.cssText="position:absolute;background:rgba(255,255,255,0.2);"; pointInfo.eleArr= [d,d2]; pointInfo.bool=true; d.appendChild(d2); document.body.appendChild(d); } </script>
</body>
</html>
查看效果的话请将domtoimage
下载下来自己查看
注意因为使用了toDataURL
方法所以需要在服务器下面才能看到效果请使用webstorm打开查看效果
还没有评论,来说两句吧...