用dom-to-image将html生成图片

落日映苍穹つ 2021-09-02 03:05 544阅读 0赞

由于业务需要,要将html的表格转成图片下载下来,一开始使用的是html2canvas.js。功能是可以实现,但是有缺陷(表格存在合并的单元格时,生成的图片表格线框不完整),后来很不容易知道了dom-to-image.js,尝试之后觉得非常不错。
废话不多说,开搞。

第一步:下载必要的js库

① jquery库(不使用jquery的就算了,要的自己能找到的):
②dom-to-image.js:这里写链接内容
③FileSaver.js:这里写链接内容

这里写图片描述

第二步:新建html,引用第一步的几个库

第三步:实现生成图片

①生成png的图片插入的到当前页面

  1. var node = document.getElementById('my-node');
  2. domtoimage.toPng(node)
  3. .then(function (dataUrl) {
  4. var img = new Image();
  5. img.src = dataUrl;
  6. document.body.appendChild(img);
  7. })
  8. .catch(function (error) {
  9. console.error('oops, something went wrong!', error);
  10. });

②生成图片并下载png格式

  1. domtoimage.toBlob(document.getElementById('my-node'))
  2. .then(function (blob) {
  3. window.saveAs(blob, 'my-node.png');
  4. });

③生成图片并下载jpeg格式

  1. domtoimage.toJpeg(document.getElementById('my-node'), { quality: 0.95 })
  2. .then(function (dataUrl) {
  3. var link = document.createElement('a');
  4. link.download = 'my-image-name.jpeg';
  5. link.href = dataUrl;
  6. link.click();
  7. });

④还两种生成SVGpixel data

  1. domtoimage.toSvg(document.getElementById('my-node'), { filter: filter})
  2. .then(function (dataUrl) {
  3. /* do something */
  4. });
  5. var node = document.getElementById('my-node');
  6. domtoimage.toPixelData(node)
  7. .then(function (pixels) {
  8. for (var y = 0; y < node.scrollHeight; ++y) {
  9. for (var x = 0; x < node.scrollWidth; ++x) {
  10. pixelAtXYOffset = (4 * y * node.scrollHeight) + (4 * x);
  11. /* pixelAtXY is a Uint8Array[4] containing RGBA values of the pixel at (x, y) in the range 0..255 */
  12. pixelAtXY = pixels.slice(pixelAtXYOffset, pixelAtXYOffset + 4);
  13. }
  14. }
  15. });

完整的Demo:

  1. <html>
  2. <head>
  3. <script type="text/javascript" src="jquery-1.11.2.min.js"></script>
  4. <script type="text/javascript" src="dom-to-image.js"></script>
  5. <script type="text/javascript" src="FileSaver.js"></script>
  6. <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>
  7. </head>
  8. <body>
  9. <input type="button" id="btn" value="do it" />
  10. <h4>两行三列:</h4>
  11. <table id="table" border="1" style="width:200px;border-collapse: collapse;border:1px solid black;">
  12. <tr style="background:green;">
  13. <td rowspan="3">200</td>
  14. <td>200</td>
  15. <td>300</td>
  16. </tr>
  17. <tr style="background:green;">
  18. <td rowspan="2">500</td>
  19. <td>600</td>
  20. </tr>
  21. <tr style="background:green;">
  22. <td>600</td>
  23. </tr>
  24. <tr style="background:skyblue;">
  25. <td rowspan="3">100</td>
  26. <td>200</td>
  27. <td>300</td>
  28. </tr>
  29. <tr style="background:skyblue;">
  30. <td>500</td>
  31. <td>600</td>
  32. </tr>
  33. <tr style="background:skyblue;">
  34. <td>600</td>
  35. <td>600</td>
  36. </tr>
  37. </table>
  38. </body>
  39. </html>

dom-to-image实现的网页截图

dom-to-image如何使用请参考https://blog.csdn.net/u012260672/article/details/79302465

下面我们就不废话了直接上演示:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>echarts 测试</title>
  6. <script type="text/javascript" src="dom-to-image.js"></script>
  7. </head>
  8. <body style="position:relative;">
  9. <div style="width:100px;height:100px;background-color:#000;color:white;">
  10. 尾气请问气味哦平均气温哦啤酒去i
  11. </div>
  12. <div style="width:100px;height:100px;background-color:#ccc;"></div>
  13. <div style="width:100px;height:100px;background-color:#666;color:#ccc;">
  14. 请我陪考去请问哦
  15. </div>
  16. <div style="width:100px;height:100px;background-color:#000;color:white;">
  17. 尾气请问气味哦平均气温哦啤酒去i
  18. </div>
  19. <div style="width:100px;height:100px;background-color:#ccc;"></div>
  20. <div style="width:100px;height:100px;background-color:#000;color:white;">
  21. 尾气请问气味哦平均气温哦啤酒去i
  22. </div>
  23. <div style="width:100px;height:100px;background-color:#ccc;"></div>
  24. <div style="width:100px;height:100px;background-color:#ddd;"></div>
  25. <div style="width:900px;height:100px;background-color:#666;">
  26. 桥文件额期望寄哦IQ叫我我就群殴我为奇偶去叫哦我IQ寄哦
  27. </div>
  28. <div οnclick="jt()">点击截图</div>
  29. <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>
  30. </body>
  31. </html>

查看效果的话请将domtoimage下载下来自己查看

注意因为使用了toDataURL方法所以需要在服务器下面才能看到效果请使用webstorm打开查看效果

发表评论

表情:
评论列表 (有 0 条评论,544人围观)

还没有评论,来说两句吧...

相关阅读