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 相关文章推荐
破解Session cookie的方法
Jul 28 Javascript
JS获取页面窗口大小的代码解读
Dec 01 Javascript
js获取当月最后一天实例代码
Nov 19 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
Apr 24 Javascript
使用jQuery判断浏览器滚动条位置的方法
May 30 Javascript
瀑布流的实现方式(原生js+jquery+css3)
Jun 28 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
Sep 21 Javascript
深入理解Angular中的依赖注入
Jun 26 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
Mar 16 Javascript
利用原生JS实现data方法示例代码
May 28 Javascript
Vue formData实现图片上传
Aug 20 Javascript
js实现随机抽奖
Mar 19 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 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)
2009/01/30 PHP
PHP数据类型的总结分析
2013/06/13 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
php中explode函数用法分析
2014/11/15 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
php实现映射操作实例详解
2019/10/02 PHP
js option删除代码集合
2008/11/12 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
js实现根据身份证号自动生成出生日期
2015/12/15 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
在百度搜索结果中去除掉一些网站的资料(通过js控制不让显示)
2017/05/02 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
python逐行读取文件内容的三种方法
2014/01/20 Python
Tensorflow加载预训练模型和保存模型的实例
2018/07/27 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
EQVVS官网:设计师男装和女装
2018/10/24 全球购物
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
实习生自我鉴定范文
2013/12/05 职场文书
工程项目经理岗位职责
2013/12/15 职场文书
经济贸易专业自荐信
2014/06/11 职场文书
招标承诺书
2014/08/30 职场文书
申报材料格式
2014/12/30 职场文书
技术员岗位职责
2015/02/04 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
食堂管理制度范本
2015/08/04 职场文书
护士旷工检讨书
2015/08/15 职场文书
创业计划书之美容店
2019/09/16 职场文书