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 相关文章推荐
javascript制作loading动画效果 loading效果
Jan 14 Javascript
javascript页面加载完执行事件代码
Feb 11 Javascript
JavaScript中return false的用法
Mar 12 Javascript
浅谈javascript构造函数与实例化对象
Jun 22 Javascript
JavaScript中eval()函数用法详解
Dec 14 Javascript
关于Vue Webpack2单元测试示例详解
Aug 14 Javascript
jQuery实现用户信息表格的添加和删除功能
Sep 12 jQuery
react router 4.0以上的路由应用详解
Sep 21 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
Nov 17 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
Mar 21 Javascript
layui自己添加图片按钮并点击跳转页面的例子
Sep 14 Javascript
JS出现404错误原理及解决方案
Jul 01 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
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
2011/06/04 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
2011/11/03 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
php创建图像具体步骤
2017/03/13 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
nodejs提示:cross-device link not permitted, rename错误的解决方法
2019/06/10 NodeJs
vue实现绑定事件的方法实例代码详解
2019/06/20 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
Vue Components 数字键盘的实现
2019/09/18 Javascript
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
python迭代器实例简析
2014/09/25 Python
Python的Flask框架与数据库连接的教程
2015/04/20 Python
python实现FTP服务器服务的方法
2017/04/11 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
Python实现字符串匹配的KMP算法
2019/04/04 Python
Keras自定义实现带masking的meanpooling层方式
2020/06/16 Python
python利用线程实现多任务
2020/09/18 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
澳洲的服装老品牌:SABA
2018/02/06 全球购物
.NET面试10题
2014/02/24 面试题
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
什么是css原子化,有什么用?
2022/04/24 HTML / CSS