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 jQuery $.post $.ajax用法
Jul 09 Javascript
javascript实现图片切换的幻灯片效果源代码
Dec 12 Javascript
Jquery submit()无法提交问题
Apr 21 Javascript
JS分页控件 可用于无刷新分页
Jul 23 Javascript
jquery中get和post的简单实例
Feb 04 Javascript
我的Node.js学习之路(一)
Jul 06 Javascript
详解javascript中原始数据类型Null和Undefined
Dec 17 Javascript
Bootstrap登陆注册页面开发教程
Jul 12 Javascript
详解数组Array.sort()排序的方法
May 09 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
May 02 Javascript
js 实现在2d平面上画8的方法
Oct 10 Javascript
微信小程序module.exports模块化操作实例浅析
Dec 20 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的类树(支持无限分类)
2006/10/09 PHP
php中根据变量的类型 选择echo或dump
2012/07/05 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
JS实现的省份级联实例代码
2013/06/24 Javascript
如何使用Javascript正则表达式来格式化XML内容
2013/07/04 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
2015/11/18 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
webpack源码之loader机制详解
2018/04/06 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
JavaScript仿京东秒杀倒计时
2020/03/17 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
[03:49]辉夜杯现场龙骑士COSER秀情商“我喜欢芬队!”
2015/12/27 DOTA
python中的五种异常处理机制介绍
2014/09/02 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
pytorch进行上采样的种类实例
2020/02/18 Python
基于python实现对文件进行切分行
2020/04/26 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
台湾最大网路书店:博客来
2018/03/18 全球购物
C#面试常见问题
2013/02/25 面试题
怎样客观的做好自我评价
2013/12/28 职场文书
节能环保标语
2014/06/12 职场文书
工会趣味活动方案
2014/08/18 职场文书
暑期培训班招生方案
2014/08/26 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python
JavaScript实现两个数组的交集
2022/03/25 Javascript