JS图片压缩(pc端和移动端都适用)


Posted in Javascript onJanuary 12, 2017

最近在做移动端遇到了一个问题就是:手机拍照后,图片过大如果上传到服务器务必会浪费带宽,最重要的是流量啊别慌,好事儿来了,务必就会有人去研究研究图片的压缩:

鄙人结合前人的经验,结合自己实战,总结出一个方法供大家参考:

/**
 * 图片压缩,默认同比例压缩
 * @param {Object} path 
 *   pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照相图片储存的绝对路径
 * @param {Object} obj
 *   obj 对象 有 width, height, quality(0-1)
 * @param {Object} callback
 *   回调函数有一个参数,base64的字符串数据
 */
function dealImage(path, obj, callback){
 var img = new Image();
 img.src = path;
 img.onload = function(){
  var that = this;
  // 默认按比例压缩
  var w = that.width,
   h = that.height,
   scale = w / h;
   w = obj.width || w;
   h = obj.height || (w / scale);
  var quality = 0.7;  // 默认图片质量为0.7
  //生成canvas
  var canvas = document.createElement('canvas');
  var ctx = canvas.getContext('2d');
  // 创建属性节点
  var anw = document.createAttribute("width");
  anw.nodeValue = w;
  var anh = document.createAttribute("height");
  anh.nodeValue = h;
  canvas.setAttributeNode(anw);
  canvas.setAttributeNode(anh); 
  ctx.drawImage(that, 0, 0, w, h);
  // 图像质量
  if(obj.quality && obj.quality <= 1 && obj.quality > 0){
   quality = obj.quality;
  }
  // quality值越小,所绘制出的图像越模糊
  var base64 = canvas.toDataURL('image/jpeg', quality );
  // 回调函数返回base64的值
  callback(base64);
 }
}

当然返回的是一个base64的一个字符串;

如果可以试着测试一下压缩后的图片大小:

// 调用函数处理图片 







dealImage("路径", {
// 注意:在pc端可以用绝对路径或相对路径,移动端最好用绝对路径(因为用take photo后的图片路径,我没有试成功(如果有人试成功了可以分享一下经验))
 width : 200
}, function(base){
//直接将获取到的base64的字符串,放到一个image标签中就可看到测试后的压缩之后的样式图了
 document.getElementById("transform").src = base;
 console.log("压缩后:" + base.length / 1024 + " " + base);


})

PS:主要思想就是获取到图片,利用H5 canvas技术进行图片数据化为 base64 的字符串,最后传到后台进行,后台将base64的字符串数据进行图像化储存。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
jquery提升性能最佳实践小结
Dec 06 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
Nov 10 Javascript
JavaScript操作HTML元素和样式的方法详解
Oct 21 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
Nov 04 Javascript
JS实现点击事件统计的简单实例
Jul 10 Javascript
基于slideout.js实现移动端侧边栏滑动特效
Nov 28 Javascript
Vuejs中使用markdown服务器端渲染的示例
Nov 22 Javascript
详解微信JS-SDK选择图片遇到的坑
Aug 15 Javascript
Vue.js 十五分钟入门图文教程
Sep 12 Javascript
通过npm或yarn自动生成vue组件的方法示例
Feb 12 Javascript
VUE+node(express)实现前后端分离
Oct 13 Javascript
JavaScript中isPrototypeOf函数
Nov 07 Javascript
原生js实现淘宝购物车功能
Jun 23 #Javascript
jQuery实现拖拽可编辑模块功能代码
Jan 12 #Javascript
jQuery实现倒计时重新发送短信验证码功能示例
Jan 12 #Javascript
js仿京东轮播效果 选项卡套选项卡使用
Jan 12 #Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
Jan 12 #Javascript
JS百度地图搜索悬浮窗功能
Jan 12 #Javascript
原生js实现焦点轮播图效果
Jan 12 #Javascript
You might like
php中sprintf与printf函数用法区别解析
2014/02/17 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
PHP加密解密类实例代码
2016/07/20 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
php如何获取Http请求
2020/04/30 PHP
JS代码格式化和语法着色V2
2006/10/14 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
Angularjs分页查询的实现
2017/02/24 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
jQuery实现简单飞机大战
2020/07/05 jQuery
Python使用Django实现博客系统完整版
2020/09/29 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
对numpy中向量式三目运算符详解
2018/10/31 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
python logging模块的使用
2020/09/07 Python
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
JD Sports西班牙:英国领先的运动服装公司
2020/01/06 全球购物
计算机求职信
2013/12/01 职场文书
小学教师管理制度
2014/01/18 职场文书
各营销点岗位职责范本
2014/03/05 职场文书
一岗双责责任书
2014/04/15 职场文书
财务会计专业自荐书
2014/06/30 职场文书
2015年导购员工作总结
2015/04/25 职场文书
主婚人致辞精选
2015/07/28 职场文书
Django drf请求模块源码解析
2021/06/08 Python
解析Redis Cluster原理
2021/06/21 Redis