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 相关文章推荐
prototype 学习笔记整理
Jul 17 Javascript
javascript 获取表单file全路径
Dec 31 Javascript
JavaScript中的面向对象介绍
Jun 30 Javascript
JS动态调用方法名示例介绍
Dec 18 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
Jun 24 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
Jun 23 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
May 17 Javascript
Java与JavaScript中判断两字符串是否相等的区别
Mar 13 Javascript
jQuery事件blur()方法的使用实例讲解
Mar 30 jQuery
vue框架制作购物车小球动画效果实例代码
Sep 26 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
Nov 24 Javascript
详细分析vue响应式原理
Jun 22 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开发模式(简写版)
2007/03/15 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
利用div+jquery自定义滚动条样式的2种方法
2013/07/18 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
JavaScript 实现打印,打印预览,打印设置
2014/12/30 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
js实现精确到秒的倒计时效果
2016/05/29 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
vue this.reload 方法 配置
2018/09/12 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
Python+微信接口实现运维报警
2016/08/27 Python
浅谈python实现Google翻译PDF,解决换行的问题
2018/11/28 Python
django 消息框架 message使用详解
2019/07/22 Python
python3 实现口罩抽签的功能
2020/03/11 Python
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
金蝶的一道SQL笔试题
2012/12/18 面试题
学雷锋月活动总结
2014/04/25 职场文书
公司贷款承诺书
2014/05/30 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS