zoukankan      html  css  js  c++  java
  • 网页截图生成图片文件保存本地(兼容火狐、IE10及以上版本浏览器)

    使用到的项目:html2canvas  

    github: https://github.com/niklasvh/html2canvas/

    官网:http://html2canvas.hertzen.com/ 

    思路过程或步骤:

    1、将网页生成Base64图片数据;

    2、将Base64图片数据生成Blob数据对象;

    3、使用a标签的download属性对图片进行下载;

    4、解决一些浏览器兼容问题。

    第一步:生成Base64图片数据,需要引用html2canvas.js

    html2canvas(document.body, {
        allowTaint: true,
        taintTest: false,
        onrendered: function (canvas) {
            canvas.id = "mycanvas";
            //生成base64图片数据
            var base = canvas.toDataURL("image/png");
            var dataUrl = canvas.toDataURL();
            downloadFile(dataUrl, "orderinfo.png");
        }
    });
    第二步:生成Blob数据对象
    var base64ToBlob = function (code) {
         var parts = code.split(';base64,');
         var contentType = parts[0].split(':')[1];
         var raw = window.atob(parts[1]);
         var rawLength = raw.length;
         var uInt8Array = new Uint8Array(rawLength);
         for (var i = 0; i < rawLength; ++i) {
             uInt8Array[i] = raw.charCodeAt(i);
         }
         return new Blob([uInt8Array], {type: contentType});
    };
    第三步:使用a标签的download属性下载图片
    function downloadFile(content,fileName){
         var aLink=document.createElement('a');
         var evt=document.createEvent("HTMLEvents");
         evt.initEvent("click",true,true);
         aLink.download=fileName;
         aLink.href=URL.createObjectURL(blob);
         aLink.click();
    }
    第四步:解决一些浏览器兼容问题
    IE浏览器下,只支持IE10及以上:
    if(window.navigator.msSaveOrOpenBlob){
         var bstr=atob(content.split(',')[1]);
         var n = bstr.length;
         var u8arr = new Uint8Array(n);
         while (n--) {
             u8arr[n] = bstr.charCodeAt(n)
         }
         var blob = new Blob([u8arr]);
         window.navigator.msSaveOrOpenBlob(blob, 'xxx' + '.' + 'png')
    }

    火狐浏览器,我的版本是66,看网上的博客是61以上,没有测试过:

    var aLink=document.createElement('a');
    
    var evt=document.createEvent("HTMLEvents");
    
    evt.initEvent("click",true,true);
    
    aLink.download=fileName;
    
    aLink.href=URL.createObjectURL(blob);
    
    // aLink.click();
    
    aLink.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true, view: window}));

    还有其他的浏览器类型没有测试过。

    
    
    完整代码:
    <!DOCTYPE html>
    <html>
    <head>
        <meta name="layout" content="main">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
        <script type="text/javascript" src="html2canvas.js"></script>
        <script type="text/javascript" >
            $(document).ready( function(){
                $(".example1").on("click", function(event) {
                    event.preventDefault();
                    html2canvas(document.body, {
                        allowTaint: true,
                        taintTest: false,
                        onrendered: function(canvas) {
                            canvas.id = "mycanvas";
                            //生成base64图片数据
                            var base= canvas.toDataURL("image/png");
                            var dataUrl = canvas.toDataURL();
                            var newImg = document.createElement("img");
                            newImg.src = dataUrl;
                            downloadFile(dataUrl,"xxx.png");
                            $("#createimage").attr("src",dataUrl);
                        }
                    });
                });
            });
            function downloadFile(content,fileName){
                var base64ToBlob=function(code){
                    if(navigator.appName == "Microsoft Internet Explorer"&&parseInt(navigator.appVersion.split(";")[1].replace(/[ ]/g, "").replace("MSIE",""))<=9){
                        alert("您的浏览器版本过低,请下载IE10及以上版本");
                    }else{
                        var parts=code.split(';base64,');
                        var contentType=parts[0].split(':')[1];
                        var raw=window.atob(parts[1]);
                        var rawLength=raw.length;
                        var uInt8Array=new Uint8Array(rawLength);
                        for(var i=0;i<rawLength;++i){
                            uInt8Array[i]=raw.charCodeAt(i);
                        }
                        return new Blob([uInt8Array],{type:contentType});
                    }
                };
                var blob=base64ToBlob(content);
                if(window.navigator.msSaveOrOpenBlob){
                    var bstr=atob(content.split(',')[1]);
                    var n = bstr.length;
                    var u8arr = new Uint8Array(n);
                    while (n--) {
                        u8arr[n] = bstr.charCodeAt(n)
                    }
                    var blob = new Blob([u8arr]);
                    window.navigator.msSaveOrOpenBlob(blob, 'xxx' + '.' + 'png')
                }else{
                    var aLink=document.createElement('a');
                    var evt=document.createEvent("HTMLEvents");
                    evt.initEvent("click",true,true);
                    aLink.download=fileName;
                    aLink.href=URL.createObjectURL(blob);
                    // aLink.click();
                    //兼容火狐浏览器
                    aLink.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true, view: window}));
                }
            };
    </script>
    </head>
        <body>
            Hello!
            <div class="" style="background-color: #abc;">
                html5页面截图
            </div>
            <textArea id="textArea" col="20" rows="10" ></textArea>
            <input class="example1" type="button" value="截图">
            生成界面如下:
            <img src="" id="createimage"/>
        </body>
    </html>
    小结:有什么遗漏、错误请留言。
    参考博客链接:

    html5 实现网页截屏 页面生成图片(图文)

    纯前端实现base64图片下载,兼容IE10+

    原生JS实现base64图片下载-图片保存到本地

    前端实现图片下载

    js下载base64格式的图片(兼容火狐)

  • 相关阅读:
    TCP和UDP的最完整的区别
    kafka重置到最新offset偏移量
    MYSQL中IN,INSTR,FIND_IN_SET函数效率比较
    本地不安装ORACLE,用PLSQL访问远程数据库
    MySQL中的DEFINER与SQL SECURITY
    Centos6.8 安装tomcat8.5.11
    动态代理模式
    linux下mysql允许远程连接
    全面理解Java中的String数据类型
    Spring中获取web项目的根目录
  • 原文地址:https://www.cnblogs.com/chenking/p/10763098.html
Copyright © 2011-2022 走看看