zoukankan      html  css  js  c++  java
  • html转换成图片并下载(PC移动端通用)

    流程:将需要生成图片的部分转换为canvas,再将canvas转换成图片,将图片储存至服务器并引导用户下载

    需要使用插件:html2canvas.js、canvas2image.js、base64.js

    HTML代码

    <!DOCTYPE html>
    <html>
      <head lang="zh-CN">
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
        <meta http-equiv="x-ua-compatible" content="IE=edge, chrome=1">
        <meta name="applicable-device" content="pc,mobile">
        <title>表格</title>
        <link href="css/index.css" rel="stylesheet">
        <script src="js/jquery-1.12.4.min.js"></script>
        <!-- html2canvas就是这样一款前端插件,它的原理是将Dom节点在Canvas里边画出来 -->
        <script src="js/html2canvas.js"></script>
        <!-- 将canvas图片保存成图片 -->
        <script src="js/canvas2image.js"></script>
        <script src="js/base64.js"></script>
      </head>
      <style>
        *{
          margin: 0;padding: 0;list-style: none
        }
        .tab{
          width: 90%;margin: 20px auto;
          overflow: auto;
        }
        .tab li{
          width: 45%;
          float: left;border-left: 1px solid#666;
          border-bottom: 1px solid#666;height:50px;
          padding: 0px 0 0 6px;
          line-height: 50px;
        }
        .tab li:nth-child(1),.tab li:nth-child(2){
          border-top: 1px solid#666;
        }
        .tab li:nth-child(2),.tab li:nth-child(4),.tab li:nth-child(6),.tab li:nth-child(8),.tab li:nth-child(10){
          border-right: 1px solid#666;
        }
        .tab li input{
          width: 70%;padding:10px
        }
        #mb{
          position: fixed;
          top: 0;left: 0;
          width: 100%;height: 100%;
          background: #000;opacity: 0.5;display:none
        }
        .preview{
          position: fixed;
          top: 0;left: 0;right: 0;bottom: 0;
          width: 90%;height: 400px;margin: auto;
          background: #fff;
          padding: 20px;border-radius: 8px;
          display:none
        }
        .preview img{
          width: 100%;padding-bottom: 20px;
        }
        .preview span{
          padding: 10px 30px;
          background: #000;
          color: #fff;border-radius: 8px;
        }
        .preview span a{
          color: #fff;
        }
      </style>
    <body>
      <ul class="tab" id="content">
        <li>问题1</li>
        <li><input type="text" name="" placeholder="请输入问题1"></li>
        <li>问题2</li>
        <li><input type="text" name="" placeholder="请输入问题2"></li>
        <li>问题3</li>
        <li><input type="text" name="" placeholder="请输入问题3"></li>
        <li>姓名</li>
        <li><input type="text" name="" placeholder="请输入姓名"></li>
        <li>电话</li>
        <li><input type="text" name="" placeholder="请输入电话"></li>
      </ul>
      <button id="btnSave">提交</button>
      <div id="images" style="display: none" ></div><br><br>
      <button id="Download" >生成图片</button>
    
      <div id="mb"></div>
      <div class="preview">
        <div id="img"></div>
        <span id="downoff">关闭</span>
        <span id="downimg"></span>
      </div>
    </body>
    </html>

    JS代码

    <script>
    /*生成canvas图形*/
    $("#btnSave").click(function(){
      html2canvas(document.querySelector("#content")).then(canvas => {
        $("#images").append(canvas);
      });
      alert("提交成功")
    })
    /*canvas转化为图片*/
    $("#Download").click(function(){
      //获取网页中的canvas对象
      var mycans=$('canvas')[0];
      //调用convertCanvasToImage函数将canvas转化为img形式
      var img = convertCanvasToImage(mycans);
      //将img插入容器
      $('#img').append(img);
      $("#img img").prevAll().remove('img');
      $("#mb").fadeIn();$(".preview").fadeIn();
      var imgsrc = $('#img img').attr('src');
      $.ajax({
        type: 'post',
        data: {img:imgsrc},
        url: "你的后端接口路径",
        success: function (data) {
          //console.log(data);
          $("#downimg").html("<a href='../images/"+data+".png' download='下载图片' >保存图片</a>");
        },
        error: function () { }
      })
    })
    function convertCanvasToImage(canvas) {
      //新Image对象,可以理解为DOM
      var image = new Image();
      // canvas.toDataURL 返回的是一串Base64编码的URL
      // 指定格式 PNG
      image.src = canvas.toDataURL("image/png");
      return image;
    }
    $("#downoff").click(function(){
      if(confirm("关闭后可能会造成图片丢失,请问是否关闭。")){
        $("#mb").fadeOut();
        $(".preview").fadeOut();
      }
    })
    
    </script>

    PHP代码

    public function index()
    {
        header("Content-Type: text/html; charset=utf-8");
        $img = input('img');  
        $img = explode(',',$img); 
        $data = base64_decode($img[1]);
        $imgname = date('Y').date('m').date('d').time();
        $file = fopen("./images/$imgname.png","w"); //创建图片
        fwrite($file,$data);    //写入内容
        fclose($file);
        return $imgname;    
    }

    注意事项:

    a.下载图片路径一定要给相对路径

    b. Ajax要用post提交,图片转换成base64格式提交用get会报错url太长 414 Request-URI Too Large

    c. 储存图片的文件夹要给高权限 

    插件下载:

    http://www.caopeng.vip/plug/js/base64.js

    http://www.caopeng.vip/plug/js/html2canvas.js

    http://www.caopeng.vip/plug/js/canvas2image.js

    http://www.caopeng.vip/plug/js/jquery-1.12.4.min.js

  • 相关阅读:
    php 日期处理 DateTime
    http范围请求
    fiddle扩展
    汉字编码 (GB2312 GBK GB18030)
    Navicat http 通道增加验证
    vim 支持 nginx配置文件 语法高亮
    composer 使用
    剖析nsq消息队列(三) 消息传输的可靠性和持久化[一]
    剖析nsq消息队列(二) 去中心化源码解析
    剖析nsq消息队列(一) 简介及去中心化实现原理
  • 原文地址:https://www.cnblogs.com/caopeng/p/15112633.html
Copyright © 2011-2022 走看看