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.validate使用攻略 第五步 正则验证
Jul 01 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
Apr 17 Javascript
js实现上传图片预览的方法
Feb 09 Javascript
js鼠标滑过图片震动特效的方法
Feb 17 Javascript
JavaScript每天定时更换皮肤样式的方法
Jul 01 Javascript
javascript实现框架高度随内容改变的方法
Jul 23 Javascript
谈谈我对JavaScript DOM事件的理解
Dec 18 Javascript
Node.js操作mysql数据库增删改查
Mar 30 Javascript
JavaScript的字符串方法汇总
Jul 31 Javascript
vue 里面使用axios 和封装的示例代码
Sep 01 Javascript
利用CDN加速react webpack打包后的文件详解
Feb 22 Javascript
JavaScript数组方法的错误使用例子
Sep 13 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中数据的批量导入(csv文件)
2006/10/09 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
js变量作用域及可访问性的探讨
2006/11/23 Javascript
复制本贴标题和地址的js代码
2008/07/01 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
jquery简单实现网页层的展开与收缩效果
2015/08/07 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
详解mpvue开发小程序小总结
2018/07/25 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
微信小程序下拉菜单效果的实例代码
2019/05/14 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
javascript实现时钟动画
2020/12/03 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
python回溯法实现数组全排列输出实例分析
2015/03/17 Python
Python/Django后端使用PIL Image生成头像缩略图
2019/04/30 Python
Python内置函数locals和globals对比
2020/04/28 Python
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
劳动模范事迹材料
2014/01/19 职场文书
亲戚结婚的请假条
2014/02/11 职场文书
晚会主持词开场白
2014/03/17 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
HTML中table表格拆分合并(colspan、rowspan)
2021/04/07 HTML / CSS
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP
讲解MySQL增删改操作
2022/05/06 MySQL