美文网首页
前端图片压缩上传

前端图片压缩上传

作者: Aiq127 | 来源:发表于2020-06-21 17:17 被阅读0次

最近公司有个需求,就是上传照片时需要先压缩。
其中上传原理是用ajax上传formdata数据,压缩是采用canvas进行处理。

一、文件选择控件
<input type="file" id="fieldid" onchange="compressImg(this)" accept="image/*"/>
二、获取图片文件
var fileObj = document.getElementById(fieldid).files[0]; // js 获取文件对象
三、图片压缩处理

利用canvas处理Image对象调整像素尺寸,输出base64格式,再将base64格式转换为blob对象,再放进formdata对象

function compressImg(callback) {
        var file = fileObj ;
        var reader = new FileReader();
        reader.readAsDataURL(file);
        // 缩放图片需要的canvas
        var canvas = document.createElement('canvas');
        var context = canvas.getContext('2d');
        reader.onload=function () {
          var content = this.result; //图片的src,base64格式
          var img = new Image();
          img.src = content;
          img.onload = function (){ //图片加载完毕
            // 图片原始尺寸
            var originWidth = this.width;
            var originHeight = this.height;
            // 最大尺寸限制,可通过国设置宽高来实现图片压缩程度
            var maxWidth = 800,
                maxHeight = 800;
            // 目标尺寸
            var targetWidth = originWidth
            var targetHeight = originHeight;
            // 图片尺寸超过400x400的限制
            if(originWidth > maxWidth || originHeight > maxHeight) {
                if(originWidth / originHeight > maxWidth / maxHeight) {
                    // 更宽,按照宽度限定尺寸
                    targetWidth = maxWidth;
                    targetHeight = Math.round(maxWidth * (originHeight / originWidth));
                } else {
                    targetHeight = maxHeight;
                    targetWidth = Math.round(maxHeight * (originWidth / originHeight));
                }
            }
            // canvas对图片进行缩放
            canvas.width = targetWidth;
            canvas.height = targetHeight;
            // 清除画布
            context.clearRect(0, 0, targetWidth, targetHeight);
            // 图片压缩
            context.drawImage(img, 0, 0, targetWidth, targetHeight);
            /*第一个参数是创建的img对象;第二个参数是左上角坐标,后面两个是画布区域宽高*/
            //压缩后的图片base64 url
            /*canvas.toDataURL(mimeType, qualityArgument),mimeType 默认值是'image/jpeg';
             * qualityArgument表示导出的图片质量,只要导出为jpg和webp格式的时候此参数才有效果,默认值是0.92*/
            var dataURL = canvas.toDataURL(file.type||"image/jpeg", 0.92);//base64 格式
            // let blob = dataURItoBlob(dataURL,file.name);
            let newFile = dataURItoBlob(dataURL,file.name);
            let  formData = new FormData();
            // formData.append(option.fileName,blob);
            formData.append(option.fileName,newFile,file.name);
            callback(formData);
          }
        };
      };
function dataURItoBlob(dataurl,filename){   //dataurl是base64格式
        var arr = dataurl.split(',');
        var mime = arr[0].match(/:(.*?);/)[1];
        var bstr = atob(arr[1]);
        var n = bstr.length;
        var u8arr = new Uint8Array(n);
        while(n--){
          u8arr[n] = bstr.charCodeAt(n);
        }
        //发现ios11不支持new File()
        // let newFile = new File([u8arr], filename, {
        //   type: mime || "image/jpeg"
        // });
        // return newFile;
        return new Blob([u8arr], {type:mime || "image/jpeg"});
      };
四、ajax上传formdata
function imgUploader(formdata) {
   $.ajax({
    url : '/save_photos/',
    type : "POST",
    data : formData,
    dataType:"json",
    processData : false,         // 告诉jQuery不要去处理发送的数据
    contentType : false,        // 告诉jQuery不要去设置Content-Type请求头
    seccess:   function(res){} ,
    error: function(res){}
})
}
compressImg(imgUploader);

总结

上传文件用formdata,图像处理用canvas。

相关文章

  • 图片压缩上传

    参考1-HTML5实现图片压缩上传功能参考2-移动前端—图片压缩上传实践参考3-移动端H5图片压缩上传 大体步骤 ...

  • HTML5 file API加canvas实现图片前端JS压缩并

    一、图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验...

  • 一次基于electron的图片上传插件的开发过程

    背景: 项目前端有个图片压缩包上传功能,用户上传的时候会选择单反拍摄的巨幅图片,由于前端打不开压缩包,也没法读取压...

  • 前端图片压缩上传

    最近公司有个需求,就是上传照片时需要先压缩。其中上传原理是用ajax上传formdata数据,压缩是采用canva...

  • 前端图片压缩上传

    (纯js的质量压缩,非长宽压缩) 此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需...

  • 图片压缩上传

    关键词:h5 FileReader、canvas压缩、多图片上传 一、前言 做过前端的同学都知道,图片上传是我们遇...

  • h5上传图片压缩

    涉及知识点 uniapp项目h5,涉及到前端图片压缩上传 uni.chooseImage() canvas压缩 参...

  • 前端压缩并上传图片

    背景 移动端工单报修的场景中,上传图片的功能已经屡见不鲜,但现在手机像素普遍较高,随手拍一张图片都6、7M,十几兆...

  • iOS 网络上传图片

    上传图片 构造参数(NSArray *)files 上传图片—压缩 压缩到小于(...

  • iPic for Mac(图床神器) v1.7.0中文免费版

    上传图片相关设置 上传前压缩图片 可以在 iPic 的 偏好设置 中开启「上传前压缩图片」选项,目前支持压缩的图片...

网友评论

      本文标题:前端图片压缩上传

      本文链接:https://www.haomeiwen.com/subject/daraxktx.html