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知识点之&quot;this指针&quot;的应用
Apr 23 Javascript
jquery分页插件jpaginate在IE中不兼容问题
Apr 22 Javascript
JavaScript实现斗地主游戏的思路
Feb 29 Javascript
json实现添加、遍历与删除属性的方法
Jun 17 Javascript
移动端 一个简单易懂的弹出框
Jul 06 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
Dec 08 Javascript
微信小程序 小程序制作及动画(animation样式)详解
Jan 06 Javascript
Vue的路由动态重定向和导航守卫实例
Mar 17 Javascript
Vue实现底部侧边工具栏的实例代码
Sep 03 Javascript
React router动态加载组件之适配器模式的应用详解
Sep 12 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
Jan 18 Javascript
jquery 时间戳转日期过程详解
Oct 12 jQuery
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判断手机访问还是电脑访问示例分享
2014/01/20 PHP
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
js 图片等比例缩放代码
2010/05/13 Javascript
XENON基于JSON变种
2010/07/27 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
2016/04/17 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
python如何保证输入键入数字的方法
2019/08/23 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
css3实现一个div设置多张背景图片及background-image属性实例演示
2017/08/10 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
影视制作岗位职责
2013/12/04 职场文书
施工人员岗位职责
2013/12/12 职场文书
法律进机关实施方案
2014/03/12 职场文书
法制宣传口号
2014/06/16 职场文书
大学生个人求职信例文
2014/07/07 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
文案策划岗位职责
2015/02/11 职场文书
教师个人自我评价
2015/03/04 职场文书
2016年寒假社会实践活动总结
2015/03/27 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技