自定义上传生成图片及上传图片案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>预览</title>
    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
    <script src="/public/js/jquery-3.4.1.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="/public/js/html2canvas.js"></script>
    <style type="text/css" media="all">
        @font-face{
            font-family: "myfont";
            /*src: url("//cdn.mys360.com.mixinnet.cn/2022-01-30_61f61387e38b4.woff");*/
            src: url("//cdn.mys360.com.mixinnet.cn/2022-01-30_61f664165cdd1.woff");
	    }
        body{background-color:#000}
        .main{width:600px;margin:auto;position:relative;background:#f4f4f4;border:5px solid #d6d6d6;margin-top:5px}
        .mysdiv{position:relative}
        .yinying{position:absolute;right:0;bottom:-54px}
        .mp{padding:30px}
        .mp1{padding:5px;background-color:#d6d6d6}
        img{width:100%}
        .xia{display:flex}
        .xia img{width:calc(50% - 10px);margin:5px;float:left}
        .mpa{display:flex;border:5px solid #d6d6d6}
        .btn {background-color: #FF5722;padding: 10px 60px;text-decoration: none;color: white;margin: 10px;}
        .gangbi {
            position: absolute;
            width: 200px;
            bottom: 60px;
            right: 10px;
        }
        .input {
            border: unset;
            background-color: rgb(255 255 255 / 0%);
            position: absolute;
            left: 80px;
            top: 90px;
            width: 339px;
            text-align: center;
            font-size: 30px;
            color: #535455;
            font-weight: bold;
            font-family:myfont;
        }
    </style>
</head>
<body style="margin:0px;padding: 0px">
    {if get('id',3)==3}
    <div class="main">
        <div class="mysdiv">
            <div class="mp">
                <input type="file" onchange="inputFileBase64('inputFileImg','showimg');" id="inputFileImg" style="display: none;">
                <a href="javascript:;" onclick="get_a('inputFileImg')" class="mpa">
                    <img id="showimg" src="http://cdn.mys360.com.mixinnet.cn/2022-01-30_61f6549872fa5.png">
                </a>
            </div>
            <img src="http://cdn.mys360.com.mixinnet.cn/2022-01-30_61f61ff03b26a.png" class="yinying">
        </div>
        <div class="mysdiv xia">
            <div class="mp1">
                <input type="file" onchange="inputFileBase64('inputFileImg1','showimg1');" id="inputFileImg1" style="display: none;">
                <a href="javascript:;" onclick="get_a('inputFileImg1')">
                    <img id="showimg1" src="http://cdn.mys360.com.mixinnet.cn/2022-01-30_61f6549872fa5.png">
                </a>
                <input type="file" onchange="inputFileBase64('inputFileImg2','showimg2');" id="inputFileImg2" style="display: none;">
                <a href="javascript:;" onclick="get_a('inputFileImg2')">
                    <img id="showimg2" src="http://cdn.mys360.com.mixinnet.cn/2022-01-30_61f6549872fa5.png">
                </a>
            </div>
        </div>
    </div>
    {/if}
    {if get('id',3)==2}
    <div class="main" style="width: 500px;">
        <div class="mysdiv">
            <div class="mp">
                <input type="file" onchange="inputFileBase64('inputFileImg','showimg');" id="inputFileImg" style="display: none;">
                <a href="javascript:;" onclick="get_a('inputFileImg')" class="mpa">
                    <img id="showimg" src="http://cdn.mys360.com.mixinnet.cn/2022-01-30_61f6549872fa5.png">
                </a>
            </div>
            <img src="http://cdn.mys360.com.mixinnet.cn/2022-01-30_61f61ff03b26a.png" class="yinying">
        </div>
        <div class="mysdiv">
            <div class="mp1">
                <input type="file" onchange="inputFileBase64('inputFileImg1','showimg1');" id="inputFileImg1" style="display: none;">
                <a href="javascript:;" onclick="get_a('inputFileImg1')">
                    <img id="showimg1" src="http://cdn.mys360.com.mixinnet.cn/2022-01-30_61f6549872fa5.png">
                </a>
            </div>
        </div>
    </div>
    {/if}
    {if get('id',3)==1}
    <div class="main" style="width: 500px;border: unset;">
        <div class="mysdiv">
            <div class="mp">
                <input type="text" value="" class="input">
                <input type="file" onchange="inputFileBase64('inputFileImg','showimg');" id="inputFileImg" style="display: none;">
                <a href="javascript:;" onclick="get_a('inputFileImg')" class="mpa">
                    <img id="showimg" src="http://cdn.mys360.com.mixinnet.cn/2022-01-30_61f6609ede354.jpg">
                </a>
            </div>
            <img src="http://cdn.mys360.com.mixinnet.cn/2022-01-30_61f66160f3b01.png" class="gangbi">
            <img src="http://cdn.mys360.com.mixinnet.cn/2022-01-30_61f61ff03b26a.png" class="yinying" style="bottom: -34px;">
        </div>
 
    </div>
    {/if}
    <div align="center" style="margin-top: 50px;">
        <a href="s-kan.html?id=3" class="btn">
            3张
        </a>
        <a href="s-kan.html?id=2" class="btn">
            2张
        </a>
        <a href="s-kan.html?id=1" class="btn">
            1张
        </a>
        <a href="javascript:;" onclick="main()" class="btn">
            生成图片
        </a>
        <a href="javascript:;" onclick="mainup()" class="btn">
            生成外联
        </a>
    </div>
    <div align="center" style="margin-top: 50px;">
        <input type="text" value="" class="geturl" style="width: 500px;height: 30px;">
    </div>
</body>
<script> 
function get_a(id) {
  document.getElementById(id).click();
}
//当input发生改变时调用
function inputFileBase64(id, imgid) {
  var call = upload_file(id, [".png", ".jpg"], imgid);
}
/**
 * 返回input type[file]框 属性
 * 返回格式{base64,width,height}
 * @param input_img_id  input框id
 * @param format        支持格式json对象形势['.png','.jpg']
 */
function upload_file(input_img_id, format, imgid) {
  if (document.getElementById(input_img_id).value != "") {
    var fileExt = document
      .getElementById(input_img_id)
      .value.substr(
        document.getElementById(input_img_id).value.lastIndexOf(".")
      )
      .toLowerCase(); //获得文件后缀名
    var data = { code: false, message: "转码失败,不支持该后缀名" };
    for (var i = 0; i < format.length; i++) {
      //循环判断是否合法
      if (fileExt == format[i]) {
        data = { code: true };
      }
    }
    if (!data["code"]) {
      document.getElementById(input_img_id).value = "";
      return data;
    }
    var file = document.getElementById(input_img_id);
    var data = createReader(file.files[0], imgid);
  }
}
/**
 * 上一个方法调用
 * 返回图片信息 {code,base_64,width,height}
 * @param file
 */
function createReader(file, imgid) {
  var reader = new FileReader();
  reader.onload = function (evt) {
    var image = new Image();
    image.onload = function () {
      data = {
        code: true,
        base_64: evt.target.result, //base64格式
        width: this.width, //图片宽度
        height: this.height, //图片高度
        message: "转码成功"
      };
      //写自己的代码
      // document.getElementsByTagName('img')[0].src=data.base_64;
      document.getElementById(imgid).src = data.base_64;
    };
    image.src = evt.target.result;
  };
  reader.readAsDataURL(file);
}
// 生成图片
function main(){
	html2canvas($(".main")[0], {
        backgroundColor: "transparent",
        useCORS: true,
        background: "#ffffff", // 一定要添加背景颜色,否则出来的图片,背景全部都是透明的
        dpi: 300, // 处理模糊问题
    }).then(function(canvas) {
        imgUri = canvas.toDataURL();
        //  console.log(imgUri); //生成base64的编码图片
        $(".main").css("border","unset");
        $(".main").html('<img src="' + imgUri + '" style="display: block;">');
    })
}
// 生成并且上传图片
function mainup(){
    html2canvas($(".main")[0], {
        backgroundColor: "transparent",
        useCORS: true,
        background: "#ffffff", // 一定要添加背景颜色,否则出来的图片,背景全部都是透明的
        dpi: 300, // 处理模糊问题
    }).then(function(canvas) {
        base64 = canvas.toDataURL();
        // 压缩
        dealImage(base64, 700, useImg);
        function useImg(base64) {
            str= base64;
            ajaxup(convertBase64UrlToBlobpic(str))
        }
    })
}
/**  
 * 将以base64的图片url数据转换为Blob  
 * @param urlData  
 * 用url方式表示的base64图片数据  
 */  
function convertBase64UrlToBlobpic(urlData){  
    var bytes=window.atob(urlData.split(',')[1]);        //去掉url的头,并转换为byte  
    //处理异常,将ascii码小于0的转换为大于0  
    var ab = new ArrayBuffer(bytes.length);  
    var ia = new Uint8Array(ab);  
    for (var i = 0; i < bytes.length; i++) {  
        ia[i] = bytes.charCodeAt(i);  
    }  
    return new Blob( [ab] , {type : 'image/jpg'});  
} 
// ajax上传
function ajaxup(file){  
    var formFile = new FormData();
    formFile.append("file",file,"图片.jpg"); 
    var data = formFile;
    $.ajax({  
        url : "/admin-up-up.html",
        type : "POST",  
        data : data,  
        dataType:"text",  
        processData : false,
        contentType : false, 
        success:function(res){ 
        	obj = JSON.parse(res);
        	$('.geturl').val(obj.path)
        // 	alert(obj.path);
        }
    }) 
} 
//压缩方法
function dealImage(base64, w, callback) {
  var newImage = new Image();
  var quality = 0.6; //压缩系数0-1之间
  newImage.src = base64;
  newImage.setAttribute("crossOrigin", "Anonymous"); //url为外域时需要
  var imgWidth, imgHeight;
  newImage.onload = function () {
    imgWidth = this.width;
    imgHeight = this.height;
    var canvas = document.createElement("canvas");
    var ctx = canvas.getContext("2d");
    if (Math.max(imgWidth, imgHeight) > w) {
      if (imgWidth > imgHeight) {
        canvas.width = w;
        canvas.height = (w * imgHeight) / imgWidth;
      } else {
        canvas.height = w;
        canvas.width = (w * imgWidth) / imgHeight;
      }
    } else {
      canvas.width = imgWidth;
      canvas.height = imgHeight;
      quality = 0.6;
    }
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.drawImage(this, 0, 0, canvas.width, canvas.height);
    var base64 = canvas.toDataURL("image/jpeg", quality); //压缩语句
    callback(base64); //必须通过回调函数返回,否则无法及时拿到该值
  };
}

</script>
</html>


评论