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实现的支持lrc歌词的播放器
May 17 Javascript
javascript得到XML某节点的子节点个数的脚本
Oct 11 Javascript
js实现图片轮换效果代码
Apr 16 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
Nov 25 Javascript
判断javascript的数据类型(示例代码)
Dec 11 Javascript
document.forms用法示例介绍
Jun 26 Javascript
jQuery读取XML文件内容的方法
Mar 09 Javascript
vue中导出Excel表格的实现代码
Oct 18 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
Oct 23 Javascript
JavaScript两种计时器的实例讲解
Jan 31 Javascript
JavaScript 替换所有匹配内容及正则替换方法
Feb 12 Javascript
JS实现打砖块游戏
Feb 14 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 魔术方法使用说明
2009/10/20 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
一个JQuery操作Table的代码分享
2012/03/30 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
chrome调试javascript详解
2015/10/21 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
微信小程序 接入腾讯地图的两种写法
2021/01/12 Javascript
详解分布式任务队列Celery使用说明
2018/11/29 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
工厂会计员职责
2014/02/06 职场文书
大学生标准自荐书
2014/06/15 职场文书
扬尘污染防治方案
2014/06/15 职场文书
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
Python实现抖音热搜定时爬取功能
2022/03/16 Python