JS实现压缩上传图片base64长度功能


Posted in Javascript onDecember 03, 2019

这篇文章主要介绍了js实现压缩上传图片base64长度功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

im发送图片,现将图片压缩再上传

1) 调用 FileReader 的 reader.readAsDataURL(img); 方法, 在其onload事件中, 将用户选择的图片读入 Image对象.

2) 在image对象的 onload 事件中, 通过 canvas 的 canvas.getContext('2d') 的 drawImage 方法, 将Image 改变大小绘制到canvas上.

3) 通过 canvas.toDataURL("image/jpeg", 1); 方法, 将图片变成base64字符串, 放到send_image_value

toDataURL

canvas.toDataURL(type, encoderOptions); 

返回值

包含 data URI 的DOMString

type

图片格式,默认为 image/png

encoderOptions

在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。

html

<input id="sendImage" title="send a picture" type="file" accept="image/*" onchange="imgChange(this)">
 <input type="hidden" value="" id="send_image_value">
 <img id="showLoadingimg" src="'+CHAT_SITE_URL+'/templates/default/images/loading.gif" style="position:relative;left:200px;top:200px;z-index:999;display:none;">

js

function imgChange(e){
  //检查是否有文件被选中
    if (e.files.length != 0) {
      var file = e.files[0],
      fileType = file.type,
      reader = new FileReader();
      if (!reader) {
        e.value = '';
        return;
      };
      var size = file.size;
      var max_size = 2*1024*1024;
      if(size>max_size){
        e.value = '';
        $("#send_alert").html('file is too large(>2M)');
        return;
      }
      $("#showLoadingimg").show();
      reader.onload = function(e) {
        //读取成功,显示到页面并发送到服务器
        e.value = '';
        var org_img = e.target.result;
        var image_base64 = org_img;
        if(size>1024*80){//>80K的
          var img = new Image(); 
          img.src = org_img; 
          img.onload=function(){
            var scale = 1;  
            if(this.width > 300 || this.height > 300){   
              if(this.width > this.height){  
                scale = 300 / this.width; 
              }else{  
                scale = 300 / this.height;  
              }  
            } 
            var canvas = document.createElement("canvas"), drawer = canvas.getContext("2d");
            if(scale!=1) {//按最大高度等比缩放
              img.width *= scale;
              img.height *= scale;
            }
            canvas.width = img.width;
            canvas.height = img.width * (img.height / img.width);
            drawer.drawImage(img, 0, 0, canvas.width, canvas.height);
            var tmp_code = image_base64 = canvas.toDataURL(fileType);
            if(tmp_code!='data:,'){
              image_base64 = tmp_code;
            }
            img_send(image_base64);
          }; 
             
        }else{
          img_send(image_base64);
        }
         
      };
      reader.readAsDataURL(file);
    }
  }
  /**
   *为将图片赋值给消息
  **/
  function img_send(image_base64){
    if(image_base64!='data:,'){
      $("#send_image_value").val(image_base64);
      send_msg();
      $("#showLoadingimg").hide();
      $('#sendImage').val("");
    }
  }

开始时,toDataURL获取的值是data:,

$("#send_image_value").val(image_base64);
send_msg();

这两句写在

reader.onload方法的最下面这就导致图片并没有压缩

因为img.onload还没执行完

发送的还是原来的图片

在调整后就可以实现图片的压缩了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
datePicker——日期选择控件(with jquery)
Feb 20 Javascript
用dom+xhtml+css制作的一个相册效果代码打包下载
Jan 24 Javascript
jquery ajax 同步异步的执行示例代码
Jun 23 Javascript
javascript数组输出的两种方式
Jan 13 Javascript
JS实现向表格行添加新单元格的方法
Mar 30 Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
Mar 02 Javascript
vue2.0的虚拟DOM渲染思路分析
Aug 09 Javascript
浅析Vue实例以及生命周期
Aug 14 Javascript
使用vue实现多规格选择实例(SKU)
Aug 23 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
Aug 28 Javascript
Vuex实现数据共享的方法
Dec 20 Javascript
js实现AI五子棋人机大战
May 28 #Javascript
angular inputNumber指令输入框只能输入数字的实现
Dec 03 #Javascript
JavaScript的console命令使用实例
Dec 03 #Javascript
JavaScript实现京东放大镜效果
Dec 03 #Javascript
微信小程序实现图片压缩
Dec 03 #Javascript
Ant Design Pro 下实现文件下载的实现代码
Dec 03 #Javascript
Vue.js 无限滚动列表性能优化方案
Dec 02 #Javascript
You might like
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
随机广告显示(PHP函数)
2006/10/09 PHP
php $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
2010/06/21 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
2017/10/10 Javascript
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
JavaScript数组排序小程序实现解析
2020/01/13 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
Python下的subprocess模块的入门指引
2015/04/16 Python
Django框架自定义session处理操作示例
2019/05/27 Python
使用Pycharm分段执行代码
2020/04/15 Python
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
英国高街电视:High Street TV
2018/05/22 全球购物
满月酒答谢词
2014/01/14 职场文书
新闻编辑求职信
2014/04/09 职场文书
大班幼儿评语大全
2014/04/30 职场文书
自荐信模板大全
2015/03/27 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书
python基础之文件操作
2021/10/24 Python
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android
Linux中sftp常用命令整理
2022/06/28 Servers