js 压缩图片的示例(只缩小体积,不更改图片尺寸)


Posted in Javascript onOctober 21, 2020

本文作者:Marydon

原文链接:https://www.cnblogs.com/Marydon20170307/p/11486511.html

1.情景展示

js 压缩图片的示例(只缩小体积,不更改图片尺寸)

如上图所示,点击上传图片按钮,调用手机摄像头拍照功能。 

<input onchange="javascript:imgFun.uploadPicture();" type="file" name="file" id="file" accept="image/*" capture="camera" style="display: none;">

我们知道现在,手机拍照在10MB左右,体积太大,在上传到服务器前,能不能只缩小图片的体积,而不改变图片尺寸?

2.原因分析

通过canvas实现对图片的重新绘制。 

代码展示:

/**
 * 图片压缩
 * @explain 借助canvas对图片进行重绘(canvas2DataURL)
 * @param base64Url base64格式的图片字符串
 * @param imgAttr  重绘图片宽度、高度、质量等属性的设置
 * @param callback 该函数执行完毕后,要执行的回调函数
 * @returns
 */
function photoCompress (base64Url, imgAttr, callback){
  var img = new Image();
  img.src = base64Url;
  img.onload = function(){
    var that = this;
    // 默认按比例压缩
    var w = that.width,
      h = that.height,
      // 宽高比例
      scale = w / h;
    w = imgAttr.width || w;
    h = imgAttr.height || (w / scale);
    // 默认图片质量为0.7
    var quality = 0.7;
    //生成canvas
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    // 创建属性节点
    var anw = document.createAttribute("width");
    anw.nodeValue = w;
    canvas.setAttributeNode(anw);
    var anh = document.createAttribute("height");
    anh.nodeValue = h;
    canvas.setAttributeNode(anh);
    ctx.drawImage(that, 0, 0, w, h);
    // 图像质量(0-1)
    if(imgAttr.quality && imgAttr.quality <= 1 && imgAttr.quality > 0){
      quality = imgAttr.quality;
    }
    // 重绘后的图片类型
    var imgType = imgAttr.type || 'image/jpeg';
    // quality值越小,所绘制出的图像越模糊
    var base64 = canvas.toDataURL(imgType, quality);
    // 回调函数返回base64的值
    callback(base64);
  };
}

可自定义设置图片质量,图片的宽高(通过imgAttr设置)。

3.完整示例

// js 获取文件对象
var fileObj = document.getElementById("file").files[0];
if (null == fileObj) {
  alert("图像上传失败,请重试!");
}
// 文件读取对象
var reader = new FileReader();
// 图片转base64(Blob对象或File对象)
reader.readAsDataURL(fileObj);
// 图片大小<=1MB,size的单位:B(1Mb=1B*1024*1024)
if(fileObj.size/1024 <= 1024) {
  reader.onload = function(e) {
    // 获取对应的base64
    var imgBase64 = e.target.result;
    // 将图片的base64码传给后台
    // 调用腾讯接口
    $.post(baseUrl + "/weixin/facein/upImg2.do",{imgBase64:imgBase64},function(resData){
      // TODO 对返回的接口数据进行自动填充处理
    });
  };
} else {
  // 读取完毕
  reader.onload = function(){
    // 图片转换成为base64Url
    var fileBase64 = this.result;
    // 图片参数
    var imgAttr = {quality : 0.2, type : 'img/jpeg'};
    // 回调函数
    var callBack = function (base64Codes) {
      // 图片比较
      // 调用腾讯接口
       
    };
    // 压缩图片
    photoCompress(fileBase64,imgAttr,callBack);
  };
}

说明:

前端对图片进行重绘,对浏览器有一定的要求,我测试的时候在电脑端没有问题,但是,在微信上使用时,就会很难受了,会将微信的qq浏览器内核搞垮,根本无法使用。

不得以,放弃了在前端进行压缩的想法,转而直接将图片以流的形式提交至后台,由java负责图片压缩处理。

补充:

图片优化方面可以考虑从以下几个方面着手:减小分辨率 >压缩图片>chrome使用webp格式

写在最后

哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

以上就是js 压缩图片的示例(只缩小体积,不更改图片尺寸)的详细内容,更多关于js 压缩图片的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
如何用javascript去掉字符串里的所有空格
Feb 08 Javascript
Mootools 1.2教程 同时进行多个形变动画
Sep 15 Javascript
javascript void(0)的妙用
Oct 21 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
Nov 04 Javascript
面向对象Javascript核心支持代码分享
May 23 Javascript
用JS实现3D球状标签云示例代码
Dec 01 Javascript
JavaScript生成的动态下雨背景效果实现方法
Feb 25 Javascript
readonly和disabled属性的区别
Jul 26 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
Nov 03 Javascript
Vue中的验证登录状态的实现方法
Mar 09 Javascript
Vue分页器实现原理详解
Jun 28 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
Nov 01 Javascript
vue-cli4使用全局less文件中的变量配置操作
Oct 21 #Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
Oct 21 #Javascript
js 图片懒加载的实现
Oct 21 #Javascript
uniapp实现可以左右滑动导航栏
Oct 21 #Javascript
解决vue-loader加载不上的问题
Oct 21 #Javascript
Vue实现返回顶部按钮实例代码
Oct 21 #Javascript
vue将文件/图片批量打包下载zip的教程
Oct 21 #Javascript
You might like
Smarty变量调节器失效的解决办法
2014/08/20 PHP
php单态设计模式(单例模式)实例
2014/11/18 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
Laravel事件监听器用法实例分析
2019/03/12 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
javascript优先加载笔记代码
2008/09/30 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
jQuery实用密码强度检测
2017/03/02 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
Python中zfill()方法的使用教程
2015/05/20 Python
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
使用python实现knn算法
2017/12/20 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
python中zip()函数遍历多个列表方法
2021/02/18 Python
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
申报职称专业技术个人的自我评价
2013/12/12 职场文书
企业总经理岗位职责
2014/02/13 职场文书
总经理任命书
2014/03/29 职场文书
企业文化宣传标语
2014/06/09 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
统招统分证明
2015/06/23 职场文书
军训后的感想
2015/08/07 职场文书