前些天公司要求在微信移动端做上传图片并预览的功能,要求能够调用摄像头拍照并立即预览。

  在网上搜了一些方法,开始自己写了个简单的功能实现代码。结果发现移动端拍照出来的图片动不动就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)的更多相关文章

  1. html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器

    以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上 ...

  2. [javascript]——移动端 HTML5 图片上传预览和压缩

    在开发移动端web网页中,我们不可避免的会遇到文件上传的功能,但由于手机图片尺寸太大,上传时间过长导致用户体验太差,就需要在上传前对图片进行一定的压缩. 在代码之前,有必要先了解我们即将使用到的几个A ...

  3. 使用jQuery在上传图片之前实现缩略图预览

    使用jQuery在上传图片之前实现缩略图预览 jQuery代码 01 $("#uploadImage").on("change", function(){ 02 ...

  4. 【微信小程序云开发】1分钟学会实现上传、下载、预览、删除图片,并且以九宫格展示图片

    大家好,我叫小秃僧 这篇文章是讲解云开发如何上传.下载.预览.删除图片,并且以九宫格展示图片的功能 @ 目录 1. 实现效果 2.JavaScript代码 3.wxml代码 4.wxss代码 1. 实 ...

  5. javascript实现 京东淘宝等商城的商品图片大图预览功能(图片放大器)

      在京东和淘宝等购买东西的时候,我们会经常预览左侧商品展示图片,把鼠标放到原图,右侧就会有个大图显示出细节.本文将带领大家写一个这样简单的功能! 一.实现原理 当鼠标移入某一图片内部时,图片上部会出 ...

  6. input上传图片(file),预览图片的两种方法。blob与base64编码

    上传图片时一般都需要预览,我一般用这两种方法来实现.base64编码可以直接上传到后台,后台解析下,得到的文件就会比较小了,省去了压缩图片这一步了. //获取对象input file 的图片地址,放进 ...

  7. JS实现图片base64转blob对象,压缩图片,预览图片,图片旋转到正确角度

    base64转blob对象 /** 将base64转换为文件对象 * @param {String} base64 base64字符串 * */ var convertBase64ToBlob = f ...

  8. HTML5时代的纯前端上传图片预览及严格图片格式验证函数(转载)

    原文地址:http://www.2cto.com/kf/201401/274752.html 一.要解决什么样的问题? 在写这个函数之前,有们童鞋在群里问如何纯前端严格验证图片格式.这在html5时代 ...

  9. html5 前端图片处理(预览、压缩、缩放)

    现在手机图片是越来越大了,上传图片流量耗费巨大.同时预览也是一个问题,所以利用HTML5 file和canvas来解决这个问题. var upload = { _o: null,//对象id _aut ...

随机推荐

  1. iOS开发学习路径的一些建议

    结合自己情况聊下iOS学习建议,这里不讲大道理,说说具体怎么做.欢迎大家拍砖. 1.第一点要求 ,能比较顺畅的阅读官方的文档 如果你连官方的文档读起来都非常困难,那你还谈什么提高和进阶,咱们学习iOS ...

  2. 单点登录实现(spring session+redis完成session共享)

    一.前言 项目中用到的SSO,使用开源框架cas做的.简单的了解了一下cas,并学习了一下 单点登录的原理,有兴趣的同学也可以学习一下,写个demo玩一玩. 二.工程结构 我模拟了 sso的客户端和s ...

  3. 【openstack N版】——认证服务keystone

    一. 基础环境 1.1环境介绍 linux-node1(控制节点) #系统版本 [root@linux-node1 ~]# cat /etc/redhat-release CentOS Linux r ...

  4. iOS 创建一个在退出登录时可以销毁的单例

    一.单例简介 单例模式是在软件开发中经常用的一种模式.单例模式通俗的理解是,在整个软件生命周期内,一个类只能有一个实例对象存在. 二.遇到的问题 在平时开发使用单例的过程中,有时候会有这样的需求,在用 ...

  5. Android.mk模板(持续更新中)

    此文列出Android.mk的常用模板(部分内容源于多篇他人博客,这里不具体指出),如有错漏,还请在评论中指出,后期持续更新   #链接第三方动态库,在和部分android源码的编译中验证不过 LOC ...

  6. Alamofire源码解读系列(三)之通知处理(Notification)

    本篇讲解swift中通知的用法 前言 通知作为传递事件和数据的载体,在使用中是不受限制的.由于忘记移除某个通知的监听,会造成很多潜在的问题,这些问题在测试中是很难被发现的.但这不是我们这篇文章探讨的主 ...

  7. 关于 myBatis 中的 jdbcType的细节问题

    前几天上线了一个 版本,第二天到公司的时候,在cat上发现了一个长sql查询非常耗时,几乎把线上的项目搞崩溃了.我马上开始排查问题.最终发现 球队的ID传过来的时候是String 类型的,但是在执行s ...

  8. 【需求工程】KANO模型

    引言 1979年10月东京理工大学教授狩野纪昭(Noriaki Kano)和其同事 Fumio Takahashi发表的论文 <Motivator and Hygiene Factor in Q ...

  9. Jquery的学习:基础核心!

    一.什么是 jQuery jQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一整套定义好的方法.它的作者是John Resig,于2006年创建的一个开源项目,随着 ...

  10. DOM基础(二)

    在我之前写的DOM基础(一)的文章中提到过兼容性的问题,也就是在获取标签间文本信息的时候,早期的火狐版本是不支持innerText的,只支持textContent ,现在的火狐浏览器两者都支持.而IE ...