前端预览图片和H5canvas压缩图片上传
2024-09-30 11:26:35
思路是将图片抽样显示在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
中 - 调用
canvas
的toDataURL,
取出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);
});
最新文章
- STC12C5A60S2 双串口通信
- MS SQLSERVER中如何快速获取表的记录总数
- python基础学习
- Android基础知识总结
- osx xcode 创建python项目
- Python显示函数调用堆栈
- Codeforces Round #215 (Div. 1) B
- 对于python的内存管理的好文章
- PHP中几个输出函数echo,print(),print_r(),sprintf(),var_dump()的区别
- 【leetcode】 算法题 两数之和
- 使用 Swoole 来加速 Laravel应用
- Java 使用 Map 实现缓存工具
- ②萨克斯,音符的悠扬(Session管理)
- Go语言远程执行ssh命令简单封装(支持带交互命令)
- 必读:Spark与kafka010整合
- 对python pickle的理解
- 晨枫U盘启动盘制作工具V4.0-安装原版Win7
- day 46 Django 学习3 数据库单表操作以及反向解析
- oracle什么时候须要commit
- (zxing.net)二维码Data Matrix的简介、实现与解码
热门文章
- POJ 3258 River Hopscotch (二分法)
- Linux常用命令大全 --- 文件备份和压缩命令
- JSP配置即报错以及解决办法(未更新完)
- Couchbase第一印象(架构特性)
- 【HTML/XML 4】实例分析HTML和XML的不同
- C# CreateDataTable
- [luoguP2886] [USACO07NOV]牛继电器Cow Relays(矩阵)
- [HDU4417]Super Mario(主席树+离散化)
- 【网络流】【待补】C. Heidi and Library (hard)
- visual svn 搭建