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 相关文章推荐
JS获取文本框,下拉框,单选框的值的简单实例
Feb 26 Javascript
js动态添加onclick事件可传参数与不传参数
Jul 29 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
Apr 27 Javascript
在浏览器中打开或关闭JavaScript的方法
Jun 03 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
Jan 22 Javascript
js制作网站首页图片轮播特效代码
Aug 30 Javascript
angular route中使用resolve在uglify压缩后问题解决
Sep 21 Javascript
详解jquery easyui之datagrid使用参考
Dec 05 Javascript
vue.js加载新的内容(实例代码)
Jun 01 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
Jul 31 Javascript
使vue实现jQuery调用的两种方法
May 12 jQuery
微信小程序上传图片到php服务器的方法
May 23 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 清除网页病毒的方法
2008/12/05 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
JS 时间显示效果代码
2009/08/23 Javascript
Extjs中通过Tree加载右侧TabPanel具体实现
2013/05/05 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
原生js实现倒计时功能(多种格式调用)
2017/01/12 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
利用JavaScript实现栈的数据结构示例代码
2017/08/02 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
Django接受前端数据的几种方法总结
2016/11/04 Python
python Flask实现restful api service
2017/12/04 Python
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
python读文件的步骤
2019/10/08 Python
python实现数字炸弹游戏
2020/07/17 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
面向对象编程是如何提高软件开发水平的
2014/05/06 面试题
入党自我鉴定范文
2013/10/04 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
团日活动总结书格式
2014/05/08 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
Pytest中skip和skipif的具体使用方法
2021/06/30 Python
漫画「你在春天醒来」第10卷封面公开
2022/03/21 日漫