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 相关文章推荐
当jQuery遭遇CoffeeScript的时候 使用分享
Sep 17 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
Nov 30 Javascript
JavaScript 事件对象介绍
Apr 13 Javascript
AngularJS教程 ng-style 指令简单示例
Aug 03 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
Nov 05 Javascript
webpack构建vue项目的详细教程(配置篇)
Jul 17 Javascript
vue的常用组件操作方法应用分析
Apr 13 Javascript
vue实现多个元素或多个组件之间动画效果
Sep 25 Javascript
js实现同一个页面,多个enter事件绑定的示例
Oct 10 Javascript
JavaScript变量作用域及内存问题实例分析
Jun 10 Javascript
jQuery实现B2B网站后台管理系统侧导航
Jul 08 jQuery
vue-以文件流-blob-的形式-下载-导出文件操作
Aug 07 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
PHP.MVC的模板标签系统(四)
2006/09/05 PHP
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
Javascript倒计时代码
2010/08/12 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
基于Angularjs+mybatis实现二级评论系统(仿简书)
2017/02/13 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
vue-socket.io跨域问题有效解决方法
2020/02/11 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
对于Python的Django框架部署的一些建议
2015/04/09 Python
Python下载懒人图库JavaScript特效
2015/05/28 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
python爬虫之遍历单个域名
2019/11/20 Python
django序列化serializers过程解析
2019/12/14 Python
python numpy数组复制使用实例解析
2020/01/10 Python
Python 如何创建一个线程池
2020/07/28 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
年终奖发放方案
2014/06/02 职场文书
班级体育活动总结
2014/07/05 职场文书
小学生运动会报道稿
2014/09/12 职场文书
2015新学期家长寄语
2015/02/26 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
Python time库的时间时钟处理
2021/05/02 Python
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python
python基础之类方法和静态方法
2021/10/24 Python
MongoDB支持的数据类型
2022/04/11 MongoDB