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 相关文章推荐
Ctrl+Enter提交内容信息
Jun 26 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
Apr 01 Javascript
moment.js轻松实现获取当前日期是当年的第几周
Feb 05 Javascript
jquery获取css的color值返回RGB的方法
Dec 18 Javascript
基于javascript实现checkbox复选框实例代码
Jan 28 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
JavaScript制作简易计算器(不用eval)
Feb 05 Javascript
jQuery实现弹窗居中效果类似alert()
Feb 27 Javascript
JS仿淘宝搜索框用户输入事件的实现
Jun 19 Javascript
vue2.0 computed 计算list循环后累加值的实例
Mar 07 Javascript
详解express + mock让前后台并行开发
Jun 06 Javascript
微信小程序实现轮播图指示器
Jun 25 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读取Excel类文件
2017/05/15 PHP
javascript 面向对象 function类
2010/05/13 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
在百度搜索结果中去除掉一些网站的资料(通过js控制不让显示)
2017/05/02 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
Python中的True,False条件判断实例分析
2015/01/12 Python
Python如何生成树形图案
2018/01/03 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
图解Python变量与赋值
2018/04/03 Python
python定时关机小脚本
2018/06/20 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
高级3D打印市场:Gambody
2019/12/26 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
灵泰克Java笔试题
2016/01/09 面试题
大学生职业生涯规划书前言
2014/01/09 职场文书
学习十八大坚定理想信念心得体会
2014/03/11 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
深度好文:50条没人告诉你的人生经验,句句精辟
2019/08/22 职场文书
Python如何使用logging为Flask增加logid
2021/03/30 Python
Python 多线程处理任务实例
2021/11/07 Python
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server
windows系统安装配置nginx环境
2022/06/28 Servers