上传图片转为base64格式预览并压缩图片(不兼容IE9以下浏览器,兼容移动端ios,android)
前些天公司要求在微信移动端做上传图片并预览的功能,要求能够调用摄像头拍照并立即预览。
在网上搜了一些方法,开始自己写了个简单的功能实现代码。结果发现移动端拍照出来的图片动不动就2M+,又因为要批量上传,为用户的流量和上传速度考虑,我决定做一下优化,看能不能在预览前就压缩一下图片尺寸。
结果又是一阵百度,发现一个靠谱的封装好的base64图片预览及压缩的方法。
直接上下载地址吧:
http://www.imwinlion.com/wp-content/uploads/2016/05/localresizeimg.rar
源码和用法都很简单,稍微看下源码就懂了,为了兼容移动端,请一定将/path/mobileBUGFix.mini.js加入到页面中。反正我是加了的,没加会有什么后果,大家有空可以测一下。
这个插件还是比较好用的,问题是我要批量上传,怎么搞?这个插件只能单个图片上传!
所以我后来改良了一下插件,在插件内部指向文件时,做了一个循环,话不多说,代码也很简单,直接上代码
/**
* 获得base64
* @param {Object} obj
* @param {Number} [obj.width] 图片需要压缩的宽度,高度会跟随调整
* @param {Number} [obj.quality=0.8] 压缩质量,不压缩为1
* @param {Function} [obj.before(this, blob, file)] 处理前函数,this指向的是input:file
* @param {Function} obj.success(obj) 处理后函数
* @example
*
*/
$.fn.localResizeIMG = function(obj) {
this.on('change', function() {
//批量预览压缩
var file,blob;
var _this=this;
if(this.files.length>1){
for(var i = 0, len=_this.files.length;i<len;i++){
file=_this.files[i];
if (window.createObjectURL!=undefined) { // basic
blob = window.createObjectURL(file) ;
} else if (window.URL!=undefined) { // mozilla(firefox)
blob = window.URL.createObjectURL(file) ;
} else if (window.webkitURL!=undefined) { // webkit or chrome
blob = window.webkitURL.createObjectURL(file) ;
}
if ($.isFunction(obj.before)) {
obj.before(_this, blob, file)
}
if(file.size/1024>300){
obj.quality=300/(file.size/1024)
}else{
obj.quality=1
}
_create(blob,obj.quality, file);
}
}else{
//单张预览压缩图片
file = this.files[0];
if (window.createObjectURL!=undefined) { // basic
blob = window.createObjectURL(file) ;
} else if (window.URL!=undefined) { // mozilla(firefox)
blob = window.URL.createObjectURL(file) ;
} else if (window.webkitURL!=undefined) { // webkit or chrome
blob = window.webkitURL.createObjectURL(file) ;
}
// 执行前函数
if ($.isFunction(obj.before)) {
obj.before(this, blob, file)
};
if(file.size/1024>300){
obj.quality=300/(file.size/1024)
}else{
obj.quality=1
}
_create(blob,obj.quality, file);
}
this.value = ''; // 清空临时数据
}); /**
* 生成base64
* @param blob 通过file获得的二进制
*/
function _create(blob,quality) {
console.log(quality);
var img = new Image();
img.src = blob;
img.onload = function() {
var that = this;
//生成比例
var w = that.width,
h = that.height,
quality = w / h;
w = obj.width || w;
h = w / quality; //生成canvas
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
$(canvas).attr({
width: w,
height: h
});
ctx.drawImage(that, 0, 0, w, h); /**
* 生成base64
* 兼容修复移动设备需要引入mobileBUGFix.js
*/
var base64 = canvas.toDataURL('image/png', quality || 0.8); // 修复IOS
if (navigator.userAgent.match(/iphone/i)) {
var mpImg = new MegaPixImage(img);
mpImg.render(canvas, {
maxWidth: w,
maxHeight: h,
quality: quality || 0.8
});
base64 = canvas.toDataURL('image/png', quality || 0.8);
} // 修复android
if (navigator.userAgent.match(/Android/i)) {
var encoder = new JPEGEncoder();
base64 = encoder.encode(ctx.getImageData(0, 0, w, h), parseFloat(quality).toFixed(1) * 100 || 80);
} // 生成结果
var result = {
base64: base64,
clearBase64: base64.substr(base64.indexOf(',') + 1)
}; // 执行后函数
obj.success(result);
};
}
}; // 例子
/*
$('input:file').localResizeIMG({
width: 100,
quality: 0.1,
//before: function (that, blob) {},
success: function (result) {
var img = new Image();
img.src = result.base64; $('body').append(img);
console.log(result);
}
});
*/
改良之后,我判断了input[type=files].files的长度,如果是批量上传的话,长度应该是大于1的,这个逻辑应该很好理解;然后循环每一个files,获取每个图片的size(图片大小),我这里的图片尺寸判断是写死了的300kb,如果这张图片>300kb,就压缩尺寸,如果相反,则按原尺寸预览。如果你用我改良后的代码,调用方法后的quality属性就不用赋值了。
with属性:你压缩后图片的宽度,不宜太小,我是设置的400,太小会失真。
before方法:开始压缩前执行函数
success方法:压缩成功后的回调函数,一般就是写预览代码,如果你要异步上传,这里也可以写ajax
说了这么多,再来说一下移动端的照相机调用,文件格式限制吧
很简单,一行搞定
<input id="images-multiple" class="weui-uploader__input" type="file" accept="image/*" multiple="multiple">
accept:接收文件的类型
multiple:可多选(android手机设置此项后,不能调用相机,只能从相册中选择;IOS手机体验还是很溜的)
id和calss自行制定就OK了。
目前的我页面在微信内跑,尚未发现问题,如有疑问欢迎探讨!!
提供一个GITHUB的类似解决方案:内容还没来得及看,有兴趣可以去看看
https://github.com/lyg945/localResizeIMG/tree/master/
上传图片转为base64格式预览并压缩图片(不兼容IE9以下浏览器,兼容移动端ios,android)的更多相关文章
- html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器
以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上 ...
- [javascript]——移动端 HTML5 图片上传预览和压缩
在开发移动端web网页中,我们不可避免的会遇到文件上传的功能,但由于手机图片尺寸太大,上传时间过长导致用户体验太差,就需要在上传前对图片进行一定的压缩. 在代码之前,有必要先了解我们即将使用到的几个A ...
- 使用jQuery在上传图片之前实现缩略图预览
使用jQuery在上传图片之前实现缩略图预览 jQuery代码 01 $("#uploadImage").on("change", function(){ 02 ...
- 【微信小程序云开发】1分钟学会实现上传、下载、预览、删除图片,并且以九宫格展示图片
大家好,我叫小秃僧 这篇文章是讲解云开发如何上传.下载.预览.删除图片,并且以九宫格展示图片的功能 @ 目录 1. 实现效果 2.JavaScript代码 3.wxml代码 4.wxss代码 1. 实 ...
- javascript实现 京东淘宝等商城的商品图片大图预览功能(图片放大器)
在京东和淘宝等购买东西的时候,我们会经常预览左侧商品展示图片,把鼠标放到原图,右侧就会有个大图显示出细节.本文将带领大家写一个这样简单的功能! 一.实现原理 当鼠标移入某一图片内部时,图片上部会出 ...
- input上传图片(file),预览图片的两种方法。blob与base64编码
上传图片时一般都需要预览,我一般用这两种方法来实现.base64编码可以直接上传到后台,后台解析下,得到的文件就会比较小了,省去了压缩图片这一步了. //获取对象input file 的图片地址,放进 ...
- JS实现图片base64转blob对象,压缩图片,预览图片,图片旋转到正确角度
base64转blob对象 /** 将base64转换为文件对象 * @param {String} base64 base64字符串 * */ var convertBase64ToBlob = f ...
- HTML5时代的纯前端上传图片预览及严格图片格式验证函数(转载)
原文地址:http://www.2cto.com/kf/201401/274752.html 一.要解决什么样的问题? 在写这个函数之前,有们童鞋在群里问如何纯前端严格验证图片格式.这在html5时代 ...
- html5 前端图片处理(预览、压缩、缩放)
现在手机图片是越来越大了,上传图片流量耗费巨大.同时预览也是一个问题,所以利用HTML5 file和canvas来解决这个问题. var upload = { _o: null,//对象id _aut ...
随机推荐
- 在 Windows 上测试 Redis Cluster的集群填坑笔记
redis 集群实现的原理请参考http://www.tuicool.com/articles/VvIZje 集群环境至少需要3个节点.推荐使用6个节点配置,即3个主节点,3个从节点. 新 ...
- 前端项目经验总结之js防缓存(避免缓存的影响)
一.问题描述:打包后的h5项目中有个server.js文件夹,这个文件夹有些时候用户更新了h5,但是加载的还是旧的server.js,所以怀疑是缓存的问题,为了避免缓存的影响所以要给server.js ...
- 作为前端工程师,必须要学会的基本工具之一(AI)
由于之前工作中一直使用的都是photoshop,所以对AI软件的使用并不是很熟,导致使用过程中,遇到了困难----字体无法选中.作为前端工程师都知道,一张设计图中有很多文字,如果纯手打那简直是要累死人 ...
- 批量删除的PHP
第一个页面shanchu.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...
- Flex 布局教程
今天给大家分享一下flex布局的语法 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于 ...
- 轻松理解JavaScript闭包
摘要 闭包机制是JavaScript的重点和难点,本文希望能帮助大家轻松的学习闭包 一.什么是闭包? 闭包就是可以访问另一个函数作用域中变量的函数. 下面列举出常见的闭包实现方式,以例子讲解闭包概念 ...
- (1)写给Web初学者的教案-----学习Web的知识架构
1:学习Web的知识架构 前文中我们简单的介绍了一些关于Web的基本知识,这里任老师再次强调一下凡是用浏览器打开的网站我们就称之为Web应用程序(B/S结构).除此之外其它需要下载安装的软件或是手机 ...
- Archlinux 的U盘自动装载(一)udisks
为什么要用 udisks + udevil 方式自动装载 U 盘? Gnome 和 KDE 下的很多文件管理器都有自己的U盘装载方案.但我的应用环境为: Archlinux,xorg,Openbox, ...
- mongodb选型问题
一.Mongodb的介绍 MongoDB 是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便. MongoDB工作在收集和文件的概念. 数据库 数据库是一个物理容器集合.每个数据库都 ...
- 【G】系列导航
G.开源的分布式部署解决方案 [G]开源的分布式部署解决方案 - 预告篇 [G]开源的分布式部署解决方案(一) - 开篇 [G]开源的分布式部署解决方案(二) - 好项目是从烂项目基础上重构出来的 [ ...