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 相关文章推荐
得到文本框选中的文字,动态插入文字的js代码
Mar 07 Javascript
在线编辑器中换行与内容自动提取
Apr 24 Javascript
jQuery EasyUI API 中文文档 - NumberBox数字框
Oct 13 Javascript
聊一聊JS中this的指向问题
Jun 17 Javascript
js自调用匿名函数的三种写法(推荐)
Aug 19 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
Feb 05 Javascript
详解如何用webpack打包一个网站应用项目
Jul 12 Javascript
Vue完整项目构建(进阶篇)
Feb 10 Javascript
layui 给数据表格加序号的方法
Aug 20 Javascript
详解使用React制作一个模态框
Mar 14 Javascript
跟混乱的页面弹窗说再见
Apr 11 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
Apr 10 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的Yii框架中请求与响应的处理流程
2016/03/17 PHP
完美的php分页类
2017/10/24 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
070823更新的一个[消息提示框]组件 兼容ie7
2007/08/29 Javascript
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
bootstrap下拉菜单使用方法解析
2017/01/13 Javascript
jQuery实现拼图小游戏(实例讲解)
2017/07/24 jQuery
微信小程序实现循环动画效果
2018/07/16 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
微信小程序如何获取地址
2019/12/24 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
python实现图片转字符小工具
2019/04/30 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
中专生求职自荐信范文
2013/12/22 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
MySQL数据库压缩版本安装与配置详细教程
2021/05/21 MySQL
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技