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 相关文章推荐
javascript 命名空间以提高代码重用性
Nov 13 Javascript
IE与firefox下Dhtml的一些区别小结
Dec 02 Javascript
js toFixed()方法的重写实现精度的统一
Mar 06 Javascript
jQuery图片轮播功能实例代码
Jan 29 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
Jul 10 Javascript
Material(包括Material Icon)在Angular2中的使用详解
Feb 11 Javascript
使用JS代码实现俄罗斯方块游戏
Aug 03 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
Nov 29 Javascript
es6 symbol的实现方法示例
Apr 02 Javascript
通过javascript实现段落的收缩与展开
Jun 26 Javascript
详解微信小程序开发之formId使用(模板消息)
Aug 27 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
Sep 05 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数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
php 生成唯一id的几种解决方法
2013/03/08 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
PHP解决中文乱码
2017/04/28 PHP
基于jQuery的的一个隔行变色,鼠标移动变色的小插件
2010/07/06 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
深入解读JavaScript中的Hoisting机制
2015/08/12 Javascript
jQuery实现点击弹出背景变暗遮罩效果实例代码
2016/06/24 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
微信小程序网络请求封装示例
2018/07/24 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
vue中使用echarts的示例
2021/01/03 Vue.js
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
python self,cls,decorator的理解
2009/07/13 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
启动targetcli时遇到错误解决办法
2017/10/26 Python
python程序控制NAO机器人行走
2019/04/29 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
全球虚拟主机商:HostGator
2017/02/06 全球购物
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
应聘收银员个人的求职信
2013/11/30 职场文书
采购主管工作职责
2013/12/12 职场文书
带薪年假请假条
2014/02/04 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书