千家信息网

html5中如何实现页面截图

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇"html5中如何实现页面截图"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"ht
千家信息网最后更新 2025年02月23日html5中如何实现页面截图

这篇"html5中如何实现页面截图"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"html5中如何实现页面截图"文章吧。

一、导入html2canvas.js

也可以直接导入链接:

使用起来也非常简单,具体的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[xss_clean];            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[xss_clean];            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 目录下,代码如下:

//存储图片并返回图片路径        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") 即可。

    webAppRootKey    root            org.springframework.web.util.WebAppRootListener    

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

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

以上就是关于"html5中如何实现页面截图"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

图片 内容 界面 存储 数据 数据库 截图 代码 节点 路径 页面 问题 方法 部分 处理 就是 属性 文章 标签 流程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 药物非活性成分数据库 网络安全法学习资料 晋宁区专业性软件开发报价表 手机服务器密码怎么改 搜索引擎数据库怎么找文献 曲靖游戏软件开发 对国产数据库发展的感受 美创数据库防水坝用户手册 软件开发满意度数据 国家网络安全宣传提出四招 视频监控的硬件和软件开发 全球基本科学指标数据库 软件开发与维护毕业论文 高保真设计用哪些软件开发 增加网络安全手抄报 细菌蛋白已有的数据库 文件服务器访问不上 东莞酒店软件开发收费 包头商城分销软件开发多少钱 清网行动网络安全手抄报 信息网络安全工程师电脑 仪陇马鞍中心网络安全宣传周 网络安全和信息化.技术 网络安全软件后门 网络技术学的什么克斯是啥 下面属于流行的数据库技术是 专业技术人员网络安全课件 网络安全保卫部门图片 http代理服务器C语言 重新安装软件如何使用数据库
0