思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法得到base64字符串来实现压缩。

1.base64转二进制文件

/**
* dataURL to blob, ref to https://gist.github.com/fupslot/5015897
* @param dataURI
* @returns {Blob}
*/
function dataURItoBlob(dataURI) {
var byteString = atob(dataURI.split(',')[1]);
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ab], {type: mimeString});
}

2.压缩 参数(图片对象,品质,输出格式) 返回压缩后图片对象

function compress(source_img_obj, quality, output_format){

        var mime_type = "image/jpeg";
if(output_format!=undefined && output_format=="png"){
mime_type = "image/png";
}
var cvs = document.createElement('canvas');
//naturalWidth真实图片的宽度
cvs.width = source_img_obj.naturalWidth;
cvs.height = source_img_obj.naturalHeight;
var ctx = cvs.getContext("2d").drawImage(source_img_obj, 0, 0);
var newImageData = cvs.toDataURL(mime_type, quality/100);
var result_image_obj = new Image();
result_image_obj.src = newImageData;
return result_image_obj;
}

3.主要流程

  • 获得和读取图片对象
  • 创建canvas,尺寸设置压缩后的图片尺寸  
  • 调用drawImage方法,把图片绘制到canvas
  • 调用canvastoDataURL,取出 base64 格式的数据
  • 调用dataURItoBlob方法转为二进制文件,再构造FormData填充二进制文件数据,通过ajax的方式进行提交
var file = e.target.files[0];
var reader = new FileReader(); //读取文件对象
reader.onload = (function(theFile) {
var img = document.getElementById("img-fileUpload_compress") //onload和onloadend
var quality = 10; //图片品质1-100
img.src = event.target.result //reader.result
window.setTimeout(function(){
var imgObj = compress(img,quality) //压缩后的图片
var src = imgObj.src; //图片的base64格式可以直接当成img的src属性值data/image
img.src = src;
var file = dataURItoBlob(src);//转二进制
file.filename = Math.round(Math.random()*100000000000000,0)+".jpg";
// 调上传接口
},1)
});
reader.readAsDataURL(file);

4.预览图片

监听表单文件变化

文件表单的样式主要通过让它后面,通过别的DOM来美化它。

<input type="file">
input.on.('change', preview);

预览

预览使用 FileReader 对象来读:

function preview(e) {
var file = e.target.files[0];
var reader = new FileReader(); reader.onloadend = function () {
// 图片的 base64 格式, 可以直接当成 img 的 src 属性值
var dataURL = reader.result;
var img = new Image();
img.src = dataURL;
// 插入到 DOM 中预览 img标签
// ...
};
reader.readAsDataURL(file); // 读出 base64
}

5.上传图片(构造 FormData填充二进制文件数据,通过ajax的方式进行提交)

var fd = new FormData();
var blob = dataURItoBlob(dataURL);
fd.append('file', blob); $.ajax({
type: 'POST',
url: '/upload',
data: fd,
processData: false, // 不会将 data 参数序列化字符串
contentType: false, // 根据表单 input 提交的数据使用其默认的 contentType
xhr: function() {
var xhr = new window.XMLHttpRequest();
xhr.upload.addEventListener("progress", function(evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
console.log('进度', percentComplete);
}
}, false); return xhr;
}
}).success(function (res) {
// 拿到提交的结果
}).error(function (err) {
console.error(err);
});

最新文章

  1. STC12C5A60S2 双串口通信
  2. MS SQLSERVER中如何快速获取表的记录总数
  3. python基础学习
  4. Android基础知识总结
  5. osx xcode 创建python项目
  6. Python显示函数调用堆栈
  7. Codeforces Round #215 (Div. 1) B
  8. 对于python的内存管理的好文章
  9. PHP中几个输出函数echo,print(),print_r(),sprintf(),var_dump()的区别
  10. 【leetcode】 算法题 两数之和
  11. 使用 Swoole 来加速 Laravel应用
  12. Java 使用 Map 实现缓存工具
  13. ②萨克斯,音符的悠扬(Session管理)
  14. Go语言远程执行ssh命令简单封装(支持带交互命令)
  15. 必读:Spark与kafka010整合
  16. 对python pickle的理解
  17. 晨枫U盘启动盘制作工具V4.0-安装原版Win7
  18. day 46 Django 学习3 数据库单表操作以及反向解析
  19. oracle什么时候须要commit
  20. (zxing.net)二维码Data Matrix的简介、实现与解码

热门文章

  1. POJ 3258 River Hopscotch (二分法)
  2. Linux常用命令大全 --- 文件备份和压缩命令
  3. JSP配置即报错以及解决办法(未更新完)
  4. Couchbase第一印象(架构特性)
  5. 【HTML/XML 4】实例分析HTML和XML的不同
  6. C# CreateDataTable
  7. [luoguP2886] [USACO07NOV]牛继电器Cow Relays(矩阵)
  8. [HDU4417]Super Mario(主席树+离散化)
  9. 【网络流】【待补】C. Heidi and Library (hard)
  10. visual svn 搭建