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 相关文章推荐
简单的无缝滚动程序-仅几行代码
May 08 Javascript
prototype 学习笔记整理
Jul 17 Javascript
JQuery AJAX提交中文乱码的解决方案
Jul 02 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
Aug 19 Javascript
javascript强大的日期函数代码分享
Sep 04 Javascript
jQuery 插件开发指南
Nov 14 Javascript
微信小程序 animation API详解及实例代码
Oct 08 Javascript
vue双向绑定简要分析
Mar 23 Javascript
react项目实践之webpack-dev-serve
Sep 14 Javascript
Vue学习之常用指令实例详解
Jan 06 Javascript
小程序实现录音功能
Sep 22 Javascript
vue3自定义dialog、modal组件的方法
Jan 04 Vue.js
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
中国的第一台收音机
2021/03/01 无线电
理解PHP5中static和const关键字的区别
2007/03/19 PHP
几个php应用技巧
2008/03/27 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
PHPThumb图片处理实例
2014/05/03 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
[01:07]2015国际邀请赛 中国区预选赛精彩回顾
2015/06/15 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
Jupyter中直接显示Matplotlib的图形方法
2018/05/24 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
介绍一下linux的文件权限
2012/02/15 面试题
三峡导游词
2015/01/31 职场文书
MongoDB支持的数据类型
2022/04/11 MongoDB