首页 > 作文

使用html2canvas.js实现页面截图并显示或上传的示例代码

更新时间:2023-04-03 03:51:03 阅读: 评论:0

最近写项目有用到html2canvas.js,可以实现页面的截图功能,但遭遇了许多的坑,特此写一篇随笔记录一下。

在使用html2canvas时可能会遇到诸如只能截取可视化界面、截图没有背景色、svg标签无法截取等问题,下面详细的说明一下。

一、导入html2canvas.js

这个不需要多说,可以从github上获取:

也可以直接导入链接: <sc从实际出发ript src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.js"></script>

使用起来也非常简单,具体的api可以去网上查找,生成png图片使用“image/png”即可。

其中$(“#xxx”)为你想要截取的div,外面可以通过jquery获取它,当然document获取也是可以的。

html2canvas($("#xxx"), {         onrendered: function (canvas) {             var url = canvas.todataurl("image/png");        window.location.href = url;           }   });

其它类型的图片如jpg,为image/jpeg等等,可自行查询api。

到这里其实简单的截图已经完成了,如果界面稍微复杂一点的话,可能就会出现各种坑,下面一个一个解决。

二、svg无法截取的问题

当我们截取一个div时,如果这个div中存在svg标签,一般情况下是截取不到的,比如截取一个流程图,得到的是下面这个样子:

可以看到,流程图的线没有截取到,也就是svg没有截取到,这时的解决方法是把svg转换成canvas再进行截图即可,直接上代码。

这里的each循环是循环所有的svg标签,将它们全部转换为canvas

if (typeof html2canvas !== 'undefined') {        //以下是对svg的处理        var nodestorecover = [];        var nodestoremove = [];        var svgelem = clonedom.find('svg');        svgelem.each(function (index, node) {            var parentnode = node.parentnode;            var svg = node.outerhtml.trim();            var canvas = document.createelement('canvas');            canvas.width = 650;            canvas.height = 798;            canvg(canvas, svg);             if (node.style.position) {                canvas.style.position += node.style.position;                canvas.style.left += node.style.left;                canvas.style.top += node.style.top;            }            nodestorecover.push({                parent: parentnode,                child: node            });            parentnode.removechild(node);            nodestoremove.push({                parent: parentnode,                child: canvas            });            parentnode.appendchild(canvas);        });           }

这里需要用到canvg.js,以及它的依赖文件rgbcolor.js,网上可以直接下载,也可以直接导入。

三、背景透明的问题

这个其实很简单,因为它默认是透明的,html2canvas中有一个参数background就可以添加背景色,如下:

html2canvas前景比较好的行业(clonedom, {      onrendered: function(canvas) {           var url =canvas.todataurl("image/png");      },      background:"#fafafa"}); 

四、只能截取可视部分的问题

如果需要截取的div超出了界面,可能会遇到截取不全的问题,如上图,只有一半的内容,这是因为看不到的部分被隐藏了,而html2canvas是无法截取隐藏的dom的。

所以此时的解决办法是使用克隆,将需要截取的部分克隆一份放在页面底层,再使用html2canvas截取这个完整的div,截取完成后再remove这部分内容即可,完整代码如下:

function showqrcode() {    scrollto(0, 0);        //克隆节点,默认为fal,即不复制方法属性,为true是全部复制。    var clonedom = $("#d1").clone(true);    //设置克隆节点的z-index属性,只要比被克隆的节点层级低即可。    clonedom.css({        "background-color": "#fafafa",        "position": "absolute",        "top": "0px",        "z-index": "-1",        "height": 798,        "width": 650    });       if (typeof html2canvas !== 'undefined') {        //以下是对svg的处理        var nodestorecover = [];        var nodestoremove = [];        var svgelem = clonedom.find('svg');//divreport为需要截取成图片的dom的id        svgelem.each(function (index, node) {            var parentnode = node.parentnode;            var svg = node春节七天乐.outerhtml.trim();            var canvas = document.createelement('canvas');            canvas.width = 650;            canvas.height = 798;            canvg(canvas, svg);             if (node.style.position) {                canvas.style.position += node.style.position;                canvas.style.left += node.style.left;                canvas.style.top += node.style.top;            }            nodestorecover.push({                parent: parentnode,                child: node            });            parentnode.removechild(node);            nodestoremove.push({                parent: parentnode,                child: canvas            });            parentnode.appendchild(canvas);        });                //将克隆节点动态追加到body后面。        $("body").append(clonedom);        html2canvas(clonedom, {            onrendered: function(canvas) {                var url =canvas.todataurl("image/png");                window.location.href = url ;                clonedom.remove();    //清空克隆的内容             },             background:"#fafafa"        });            } }

这里外面首先将要截取的div克隆一份,并将z-index设置为最小,避免引起界面的不美观,然后是对svg进行的处理,上面已经分析过了,最后将克隆节点追加到body后面即可。

在onrendered中,我们可以直接使用location.href跳转查看图片,可以进行保存操作,也可以将url写入img的src中显示在界面上,如 $(‘#imgid’).attr(‘src’,url);

最后可以在界面展示刚刚截取到的图片:

五、上传图片保存到数据库,并在界面中获取该图片显示

现在得到url了,需要上传到后端,并存到数据库中,再另一个展示的界面中加载该图片。我一般习惯于使用url来存储图片路径,而不是用blob存储。

因为需要在另一个界面中获取图片,所以我把图片存在了与webapp同级的一个resource目录下,代码如下:

//存储图片并返回图片路径        ba64decoder decoder = new ba64decoder();        byte[] b = decoder.decodebuffer(product.getpropic().substring("data:image/png;ba64,".length()));        bytearrayinputstream bais = new bytearrayinputstream(b);        bufferedimage bi1 = imageio.read(bais);        string url = "ur_resource" + file.parator + "img" + file.parator + "product_"+uuid.randomuuid().tostring().rep苏东坡最经典的诗词lace("-", "")+".png";        string totalurl = system.getproperty("root") + url;        file w2 = new file(totalurl);       西安音乐学院官网 imageio.write(bi1, "png", w2);                product.tpropic(url);    //将图片的相对路径存储到数据库中                int res = productmapper.inrtlective(product);    //添加到数据库

这里因为涉及到其它逻辑,所以只放一部分代码。

这里使用的是ba64decoder来存储图片,我们获取到图片后,需要使用substring将“data:image/png;ba64,”的内容截取掉,因为“,”后面才是图片的url, url.substring("data:image/png;ba64,".length())

对于路径,上面代码中的url是我存储到数据库中的内容,而totalurl就是实际进行imageio的write操作时存储的真实路径,getproperty()方法获取的项目的根目录,可以在web.xml中配置如下内容,然后 system.getproperty(“root”) 即可。

<!-- 配置系统获得项目根目录 --><context-param>    <param-name>webapprootkey</param-name>    <param-value>root</param-value></context-param><listener>    <listener-class>        org.springframework.web.util.webapprootlistener    </listener-class></listener>

现在图片的url就存到数据库里了,而图片本身就存储在tomcat下该项目的这个目录下。

最后外面在界面上获取,只需要在当前的url前面加上项目名即可 < img class ="depot-img" src ="<%=request.getcontextpath()%>/`+e.propic+`" >

然后就可以看到界面上显示的图片了:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。

本文发布于:2023-04-03 03:51:01,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/729a92ddf845803011fce00214224724.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:使用html2canvas.js实现页面截图并显示或上传的示例代码.doc

本文 PDF 下载地址:使用html2canvas.js实现页面截图并显示或上传的示例代码.pdf

标签:图片   界面   节点   路径
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图