iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何使用html2canvas.js实现页面截图并显示或上传
  • 791
分享到

如何使用html2canvas.js实现页面截图并显示或上传

2023-06-09 13:06:21 791人浏览 薄情痞子
摘要

小编给大家分享一下如何使用html2canvas.js实现页面截图并显示或上传,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、导入html2canvas.js这个不需要多说,可以从GitHub上获取: https://g

小编给大家分享一下如何使用html2canvas.js实现页面截图并显示或上传,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

一、导入html2canvas.js

这个不需要多说,可以从GitHub上获取: https://github.com/niklasvh/html2canvas

也可以直接导入链接: <script 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标签,一般情况下是截取不到的,比如截取一个流程图,得到的是下面这个样子:

如何使用html2canvas.js实现页面截图并显示或上传

可以看到,流程图的线没有截取到,也就是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);        //克隆节点,默认为false,即不复制方法属性,为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);

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

如何使用html2canvas.js实现页面截图并显示或上传

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

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

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

//存储图片并返回图片路径        BASE64Decoder decoder = new BASE64Decoder();        byte[] b = decoder.decodeBuffer(product.getProPic().substring("data:image/png;base64,".length()));        ByteArrayInputStream bais = new ByteArrayInputStream(b);        BufferedImage bi1 = ImageIO.read(bais);        String url = "user_resource" + File.separator + "img" + File.separator + "product_"+UUID.randomUUID().toString().replace("-", "")+".png";        String totalUrl = System.getProperty("root") + url;        File w2 = new File(totalUrl);        ImageIO.write(bi1, "png", w2);                product.setProPic(url);    //将图片的相对路径存储到数据库中                int res = productMapper.insertSelective(product);    //添加到数据库

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

这里使用的是BASE64Decoder来存储图片,我们获取到图片后,需要使用substring将“data:image/png;base64,”的内容截取掉,因为“,”后面才是图片的url, url.substring("data:image/png;base64,".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下该项目的这个目录下。

如何使用html2canvas.js实现页面截图并显示或上传

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

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

如何使用html2canvas.js实现页面截图并显示或上传

看完了这篇文章,相信你对“如何使用html2canvas.js实现页面截图并显示或上传”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 如何使用html2canvas.js实现页面截图并显示或上传

本文链接: https://www.lsjlt.com/news/256167.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用html2canvas.js实现页面截图并显示或上传
    小编给大家分享一下如何使用html2canvas.js实现页面截图并显示或上传,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、导入html2canvas.js这个不需要多说,可以从github上获取: https://g...
    99+
    2023-06-09
  • VUE如何实现选择上传图片并页面显示功能
    这篇文章给大家分享的是有关VUE如何实现选择上传图片并页面显示功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。基于VUE选择上传图片并在页面显示,图片可删除,具体内容如下dem...
    99+
    2024-04-02
  • vue中如何使用axios post上传头像/图片并实时显示到页面
    这篇文章给大家分享的是有关vue中如何使用axios post上传头像/图片并实时显示到页面的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。html代码: <div...
    99+
    2024-04-02
  • java怎么实现图片上传并显示
    在Java中实现图片上传并显示的一种常见的方法是使用Servlet和JSP。下面是一个简单的示例代码: 创建一个Servlet类来...
    99+
    2023-10-24
    java
  • spring boot实现上传图片并在页面上显示及遇到的问题小结
    最近在使用spring boot搭建网站的过程之中遇到了这样一个问题:用户注册时需要上传一个属于自己的头像,注册成功之后跳转到个人中心,在个人中心中显示用户信息.其中在显示头像的时候遇到了问题:上传头像的时候,我把头像存放到了项目文件下的s...
    99+
    2023-05-30
    spring boot 上传
  • django实现图片上传数据库并显示
    Django文件上传,供大家参考,具体内容如下 需求 1、完成学生信息注册操作 2、将学生信息入库 3、将上传文件存放至项目下media文件夹下 4、显示所有学生信息 创建模型类 ...
    99+
    2024-04-02
  • 发送ajax请求如何实现上传图片显示在网页上
    这篇“发送ajax请求如何实现上传图片显示在网页上”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2024-04-02
  • 基于Springboot+vue如何实现图片上传至数据库并显示
    这篇文章主要讲解了“基于Springboot+vue如何实现图片上传至数据库并显示”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于Springboot+vue如何实现图片上传至数据库并显示...
    99+
    2023-07-06
  • Node.js如何实现图片上传和显示方法
    小编给大家分享一下Node.js如何实现图片上传和显示方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:index.j...
    99+
    2024-04-02
  • 如何使用css实现图片在页面上以相同等比例显示缩放
    这篇文章给大家分享的是有关如何使用css实现图片在页面上以相同等比例显示缩放的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   css图片等比例显示具体代码示例如下:   &...
    99+
    2024-04-02
  • ImgUploadJS中如何使用HTML5 File API 实现截图粘贴上传、拖拽上传
    这篇文章将为大家详细讲解有关ImgUploadJS中如何使用HTML5 File API 实现截图粘贴上传、拖拽上传 ,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一 . 背景及效果 当前互联网上传文件最...
    99+
    2023-06-09
  • ajax如何上传图片到PHP并压缩图片显示
    本篇内容主要讲解“ajax如何上传图片到PHP并压缩图片显示”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ajax如何上传图片到PHP并压缩图片显示”吧!HTML代码<div i...
    99+
    2023-06-08
  • JS如何实现打开摄像头并截图上传功能
    小编给大家分享一下JS如何实现打开摄像头并截图上传功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JS打开摄像头并截图上传至后端的一个完整步骤1. 打开摄像头主要用到getUserMed...
    99+
    2024-04-02
  • 如何使用html canvas实现网页截图并嵌入到PDF
    本文小编为大家详细介绍“如何使用html canvas实现网页截图并嵌入到PDF”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用html canvas实现网页截图并嵌入到PDF”文章能帮助大家解决疑...
    99+
    2024-04-02
  • element-ui如何实现上传图片后清空图片显示
    这篇文章主要为大家展示了“element-ui如何实现上传图片后清空图片显示”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“element-ui如何实现上传图片后...
    99+
    2024-04-02
  • 怎么用Springboot+vue实现图片上传至数据库并显示
    今天小编给大家分享一下怎么用Springboot+vue实现图片上传至数据库并显示的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-06
  • HTML5中Ajax如何实现文件上传并显示进度条
    这篇文章主要介绍HTML5中Ajax如何实现文件上传并显示进度条,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下效果图:html5上传是同步上传的方式,所以能够实现进度条的显示。1.上传文件:首先我们用aj...
    99+
    2023-06-08
  • jquery如何实现页面跳转并传值
    本文小编为大家详细介绍“jquery如何实现页面跳转并传值”,内容详细,步骤清晰,细节处理妥当,希望这篇“jquery如何实现页面跳转并传值”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、jQuery页面跳转在...
    99+
    2023-07-05
  • SpringBoot2.0如何实现多图片上传加回显
    这篇文章主要为大家展示了“SpringBoot2.0如何实现多图片上传加回显”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot2.0如何实现多图片上传加回显”这篇文章吧。上传Co...
    99+
    2023-06-20
  • 使用struts2实现一个文件上传功能并显示进度条
    本篇文章为大家展示了使用struts2实现一个文件上传功能并显示进度条,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一. struts2读取进度原理分析 在strut2中控制文件上传信息的类是实现M...
    99+
    2023-05-31
    struts2 文件上传 进度条
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作