zoukankan      html  css  js  c++  java
  • 单张图片上传并压缩

    注:本文的方法只是自己测试所写,具体项目中会有各种需求和兼容性问题,尤其移动端,建议使用插件或者原生提供方法 

    思路大致如下,在 input 上绑定 change 事件,监测用户上传图片动作;

    用户上传图片后,实例化fileReader对象,获取用户上传图片的base64编码,给展示用 image 的 src 赋值该base64编码;

    new一个 image 对象,并对其 src 赋值该base64编码,判断该 image 大小;

    如果小于等于规定尺寸,将该base64编码 push 进数组;

    如果大于规定尺寸,利用 canvas 压缩图片;

    判断图片尺寸是否大于规定尺寸,如果大于规定尺寸, canvas 宽高按规定大小,否则按图片大小;

    最后利用 canvas.toDataURL() 方法得到 canvas 处理后的图片的base64编码,并将该base64编码  push 进数组。

    代码如下:

    dom结构:

    <label for="imgFile">请上传图片:</label><input id="imgFile" type="file" accept="image/jpeg,image/png,image/gif" /><br>
    <img id="imgShow" src="" alt="" />  <!-- 展示用图片 -->
    <canvas id="myCanvas"></canvas>
    <div id="btnBox">
      <button id="upBtn">上传</button>
    </div>
    <img id="treatmentImg" src="" alt="" /> <!-- canvas处理后图片 -->

    js代码如下:

    // ele 上传图片input
    function imgUp(ele){
        var file = ele.files[0],imgShow = document.getElementById('imgShow'),imgData = [],btnBox = document.getElementById('btnBox');
        // 实例化fileReader对象
        var reader = new FileReader();
        // 调用readAsDataURL方法
        reader.readAsDataURL(file);
        reader.onload = function(e){
            // 获取图片base64编码
            var result = this.result;
            // 给压缩前图片赋值src
            imgShow.src = result;
            // 实例化一个img对象并赋值src
            var img = new Image();
            img.src = result;
            // 获取上传图片的文件大小
            var imgSize = file.size/1024;
            if(imgSize>1000){
                img.onload = function(){
                    // 图片原始尺寸,压缩后最大宽高,canvas宽高,尺寸压缩比例
                    var w = this.width,h = this.height,maxWidth = 800,maxHeight = 600,canW,canH,proportion;
                    // 判断图片尺寸是否大于限定尺寸
                    if(w>maxWidth||h>maxHeight){
                        if(w>h){
                            // 图片是宽大于高的
                                canW = maxWidth;
                                proportion = w/maxWidth;
                                canH = h/proportion;
                        }else if(w<h){
                            // 图片是宽大于高的
                                canH = maxHeight;
                                proportion = h/maxHeight;
                                canW = w/proportion;
                        }
                    }else{
                        canW = w;
                        canH = h;
                    }
                    canvas = document.getElementById('myCanvas'),   
                    ctx = canvas.getContext('2d'); 
                    canvas.width = canW;   
                    canvas.height = canH;    
                    ctx.drawImage(img, 0, 0, canW,canH); 
                    var result = canvas.toDataURL("image/png",0.9);
                    imgData.push(data);
                    upBtn.style.display = "block";
                };
            }else{
                imgData.push(result);
                upBtn.style.display = "block";
            }
        };
        return imgData;
    };
    
    var imgFile = document.getElementById('imgFile'),treatmentImg = document.getElementById('treatmentImg'),mydata = [],upBtn = document.getElementById('upBtn');
    // 用户上传图片
    imgFile.onchange = function(){
        mydata = imgUp(imgFile);
    };
    // 上传按钮点击
    upBtn.onclick = function(){
        console.log(mydata);
        treatmentImg.src = mydata[0];
    };

    如有表述不准确之处,欢迎指正,欢迎补充,感谢阅读。

  • 相关阅读:
    Harbor
    Ansible自动化部署详细教程
    企业级-Shell案例18——目录入侵检测与告警
    企业级-Shell案例17——DOS攻击防范(自动屏蔽攻击IP)
    企业级-Shell案例16——自动发布PHP项目
    springboot启动报错,Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    IO流05--毕向东JAVA基础教程视频学习笔记
    IO流04--毕向东JAVA基础教程视频学习笔记
    IO流03--毕向东JAVA基础教程视频学习笔记
    IO流02--毕向东JAVA基础教程视频学习笔记
  • 原文地址:https://www.cnblogs.com/wangzhenyu666/p/8110150.html
Copyright © 2011-2022 走看看