js生成二维码,并将页面转为图片同时下载

领导忽然要我们制作一个动态生成的二维码, 并将二维码保存下来供用户分享,所以研究了一下实现的方法

一. 需要使用的插件

主要运用到下面三个插件, 网上都可以搜索下载到

  1. jquery.qrcode.min.js : 二维码生成插件
  2. html2canvas.js : 将页面元素转化为canvas插件
  3. canvas2image.js : 将canvas转化为图片插件

二. 效果图

在这里插入图片描述

  • 在输入框输入需要生成二维码的链接,
  • 然后点生成二维码,就可以看到新生成的二维码
  • 再点击生成图片, 就可以将页面直接转化为图片 并下载

三. 具体代码

  • 测试过的代码, 可直接复制使用
<body >
    <div class="bg">
        <div class="text">输入网址,点击按钮生成二维码</div>
        <input type="text" class="inp" value="http:www.baidu.com?id=1">
        <button type="button" class="erweima">生成二维码</button>
        <div id="qrcode"></div>
        <div class="text">点击生成图片,将图片分享给别人可以领奖利</div>
        <button type="button" class="picture">生成图片</button>
    </div>
    <div class="need .clearfix" ></div>
</body>
<script src="./api/jquery-3.1.1.min.js"></script>
<script type="text/javascript" src="./api/jquery.qrcode.min.js"></script>
<script src="http://html2canvas.hertzen.com/dist/html2canvas.min.js" type="text/javascript" charset="utf-8" async defer></script>
<script src="./api/canvas2image.js" type="text/javascript" charset="utf-8" async defer></script>
<script>
    var inp=$(".inp").val();
    var info=$(".title");
    var save = $(".save");
    let w = $(window).width(); //图片宽度
    let h = $(window).height(); //图片高度
    console.log(w+"    "+h);
    console.log("操作系统"+getOS());
	//选择需要生成图片的标签, 将jQuery对象转换为dom对象, 
    var need = $("body").get(0); 
    // 生成二维码
    $('.erweima').click(function() {
        jQuery('#qrcode').qrcode("http://www.baidu.com");
    })
    // 点击转成canvas,最后用于生成图片
    $('.picture').click(function(e) {
        // 调用html2canvas插件
        html2canvas(need).then(function(canvas) {
            // canvas宽度
            var canvasWidth = canvas.width;
            // canvas高度
            var canvasHeight = canvas.height;
            // 控制台查看绘制区域的宽高
            console.log('canvas:'+ canvasWidth+"    "+canvasHeight);
            // 渲染canvas,这个时候将我们用于生成图片的区域显示出来
             $(".need").show();
            // 将canvas转为图片
            var img = Canvas2Image.convertToImage(canvas, canvasWidth, canvasHeight);
            // 渲染图片,并且加到页面中查看效果
            $(".need").html(img);
            // 保存
            // console.log(img.src)
            downloadFile('测试.png', img.src);
        });
    });
    // 下载图片
    function downloadFile(fileName, content) {
        let aLink = document.createElement('a');
        let blob = base64ToBlob(content); //new Blob([content]);

        let evt = document.createEvent("HTMLEvents");
        evt.initEvent("click", true, true);//initEvent 不加后两个参数在FF下会报错  事件类型,是否冒泡,是否阻止浏览器的默认行为
        aLink.download = fileName;
        aLink.href = URL.createObjectURL(blob);
        // aLink.dispatchEvent(evt);
        aLink.click()
    }
    //base64转blob
    function base64ToBlob(code) {
        let parts = code.split(';base64,');
        let contentType = parts[0].split(':')[1];
        let raw = window.atob(parts[1]);
        let rawLength = raw.length;

        let uInt8Array = new Uint8Array(rawLength);

        for (let i = 0; i < rawLength; ++i) {
          uInt8Array[i] = raw.charCodeAt(i);
        }
        return new Blob([uInt8Array], {type: contentType});
    }
</script>
<style type="text/css" media="screen">
        body {
            margin: 0;
            padding: 20px;
        }
        .bg{
            width: 100%;
            min-height: 100%;
            height: 100vh;
            background: url('./image/timg.jpg');
            text-align: center;
            padding-top: 15px;
            text-align: center;
        }
        .text{
            color: #fff;
            width: 80%;
            margin: 15px;
            font-weight: 700;
            padding: 0 15px;
            line-height: 50px;
            border: 1px solid #b7c092;
            border-radius: 10px;
            outline: none;
        }
        .inp {
            width: 80%;
            display: block;
             margin-left: 30px;
             margin-bottom: 15px;
            line-height: 40px;
            border: 1px solid pink;
            font-size: 20px;
            border-radius: 10px;
        }
        .save, .picture, .erweima{
            border-radius: 10px;
            border: none;
            margin-bottom: 15px;
            width: 150px;
            padding: 15px;
            color: #fff;
            font-size: 22px;
            font-weight: 700;
            background: skyblue;
            outline: none;
        }
        .title{
            /* margin-top: 100px; */
        }
        .need{
            width: 100%;
            /* background: url(20.jpg) no-repeat; */
            position: fixed;
            left: 0;
            top: 0;
            display: none;
            
        }
        .need img {
            width: 90%;
            display: block;
            position: absolute;
            left: 5%;
            top: 20px;
            /*transform: translate(-50%, -50%);*/
            border: 1px solid #000;
        }
        .clearfix::before,
        .clearfix::after {
          content: "";
          display: table;
        }

        .clearfix::after {
          clear: both;
        }
    </style>
  • 觉得有用就点个赞吧! O(∩_∩)O哈哈~

猜你喜欢

转载自blog.csdn.net/weixin_45289067/article/details/105560465
今日推荐