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 相关文章推荐
手把手教你自己写一个js表单验证框架的方法
Sep 14 Javascript
对Web开发中前端框架与前端类库的一些思考
Mar 27 Javascript
javascript实现简单的html5视频播放器
May 06 Javascript
JS控制表单提交的方法
Jul 09 Javascript
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
jQuery实现下拉加载功能实例代码
Apr 01 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
Jun 21 Javascript
jQuery如何防止Ajax重复提交
Oct 14 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
Oct 27 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
Sep 18 Javascript
Angular 项目实现国际化的方法
Jan 08 Javascript
vue中 this.$set的用法详解
Sep 06 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中MVC的开发经验分享
2012/05/17 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
PHP基于ip2long实现IP转换整形
2020/12/11 PHP
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
2015/03/02 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
详解JavaScript中this的指向问题
2017/01/20 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
JavaScript实现世界各地时间显示
2020/09/07 Javascript
对python For 循环的三种遍历方式解析
2019/02/01 Python
Python错误的处理方法
2020/06/23 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
P/Invoke是什么
2015/07/31 面试题
用Java语言将一个键盘输入的数字转化成中文输出
2013/01/25 面试题
中专毕业生自荐信范文
2013/11/28 职场文书
30年同学聚会邀请函
2014/01/25 职场文书
七年级地理教学反思
2014/01/26 职场文书
快递员岗位职责
2014/09/12 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
总结Pyinstaller打包的高级用法
2021/06/28 Python