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 相关文章推荐
jquery.ui.progressbar 中文文档
Nov 26 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
May 05 Javascript
javascript笛卡尔积算法实现方法
Apr 08 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
Sep 11 Javascript
原生JavaScript制作微博发布面板效果
Mar 11 Javascript
jQuery实现简单弹窗遮罩效果
Feb 27 Javascript
微信小程序 五星评分的实现实例
Aug 04 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
Oct 24 Javascript
Webpack的dll功能使用
Jun 28 Javascript
vue src动态加载请求获取图片的方法
Oct 17 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
Aug 14 Javascript
js在HTML的三种引用方式详解
Aug 29 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
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
动态加载js文件 document.createElement
2006/10/14 Javascript
JS 动态获取节点代码innerHTML分析 [IE,FF]
2009/11/30 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
JSON格式化输出
2014/11/10 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
2017/03/23 jQuery
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
使用Kivy将python程序打包为apk文件
2017/07/29 Python
python机器学习之决策树分类详解
2017/12/20 Python
Django的HttpRequest和HttpResponse对象详解
2018/01/26 Python
python编程嵌套函数实例代码
2018/02/11 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
Python语言进阶知识点总结
2019/05/28 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
Python缓存技术实现过程详解
2019/09/25 Python
解析Python3中的Import
2019/10/13 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
企业面试题试卷附带答案
2015/12/20 面试题
财务会计应届生求职信
2013/11/24 职场文书
大学生创业项目方案
2014/03/08 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
出租房屋协议书
2014/09/14 职场文书