本文详解如何在移动端Web开发中利用HTML5实现图片上传、实时预览及压缩功能。通过FileReader读取文件,结合Canvas的toDataURL和toBlob方法,在上传前对大图进行压缩处理,有效减少传输时间并提升用户体验。
本文详细介绍如何使用JavaScript在移动端HTML5环境中实现图片上传、预览及压缩功能,供开发者参考实践。
在开发移动端Web页面时,文件上传功能是常见需求。然而,手机拍摄的照片尺寸通常较大,直接上传会导致耗时过长,严重影响用户体验。因此,在上传前对图片进行适当压缩成为必要的优化步骤。
在展示具体代码之前,有必要先了解实现该功能所依赖的几个关键API。
file 和 FileList 对象
File对象用于获取文件信息或读取文件内容。通常情况下,File对象来源于用户通过input元素选择文件后返回的FileList对象,也可以来自拖放操作生成的DataTransfer对象。
其典型使用方式如下:
<input id="test" type="file" multiple/>
// FileList 对象
var fs = document.getElementById("text").files
console.log(fs)
>>FileList
0:File
lastModified:1487309111498
lastModifiedDate:Fri Feb 17 2017 13:25:11 GMT+0800 (中国标准时间)
name:"1.png"
size:22177
type:"image/png"
webkitRelativePath:""
FileReader
FileReader是Web应用程序中用于异步读取存储在用户计算机上的文件(或原始数据缓冲)内容的接口。
1、具体使用之前,我们应先创建一个FileReader 对象
var reader = new FileReader()
2、然后读取一个文件,共有四种方式,这里只介绍我们最常使用的一个:
reader.readAsDataURL(fs); // var fs = document.getElementById("text").files
3、在 onload 事件中触发回调
reader.onload = function (e) {
console.log(e)
console.log(this)
}
// this.result 是一个base64 格式的图片地址
HTMLCanvasElement.toDataURL()
HTMLCanvasElement.toDataURL() 方法返回一个包含图片展示的 data URI。可以使用 type 参数指定其类型,默认为 PNG 格式。图片的分辨率为96dpi。
- 如果画布的高度或宽度是0,那么会返回字符串“
data:,”。 - 如果传入的类型非“
image/png”,但是返回的值以“data:image/png”开头,那么该传入的类型是不支持的。 - Chrome支持“
image/webp”类型。
语法
canvas.toDataURL(type, encoderOptions);
参数
type 可选
图片格式,默认为 image/png
encoderOptions 可选
在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围, 将会使用默认值 0.92。其他参数会被忽略。
压缩
/**
* @param {Object} f input选择的图片 必填
* @param {String} quality 图片压缩的质量[0, 1]
* @param {String} output_img_type 输出图片的类型
*/
compress: function (f, quality, output_img_type) {
var mime_type = "image/jpeg";
if(output_img_type!=undefined && output_img_type=="image/png"){
mime_type = "image/png";
}
createImageBitmap(f).then(function(imageBitmap) {
var max = 1000; // 设置最大分辨率
var c_w = '';
var c_h = '';
var width = imageBitmap.width;
var height = imageBitmap.height;
// 等比例缩放
if (width > max || height > max) {
if (width > height) {
c_w = max;
c_h = max * height / width;
} else {
c_h = max;
c_w = max * width / height;
}
}else { // 不缩放
c_w = width;
c_h = height;
}
var canvas = document.createElement('canvas');
canvas.width = c_w;
canvas.height = c_h;
var ctx = canvas.getContext('2d');
ctx.drawImage(imageBitmap,0,0, width, height, 0, 0, c_w, c_h);
canvas.toBlob(function(blob){
images.push(blob);
},mime_type, quality);
});
}
实例
下面我们就来实现图片预览和压缩功能
HTML结构如下:
<div class="upload">
<p>上传图片</p>
<form>
<input multiple id="upload_input" type="file" />
</form>
<h4>原图预览</h4>
<img src="" id="test">
<h4>压缩后预览</h4>
<img src="" id="test2" style="max-width: 200px;">
<button type="submit">点击提交</button>
</div>
JS 代码如下:
window.onload = function () {
var Upload = {
change: function () {
var oform = document.querySelector('form'),
_this = this,
res = //,
oFiles = document.getElementById('upload_input').files;
console.log(oFiles)
for(var key in oFiles) {
if(oFiles.hasOwnProperty(key)) {
var f = oFiles[key];
var type = f.type;
if(type !== 'image/png' && type !== 'image/jpg' &&type !== 'image/jpeg' ) {
alert("图片的格式必须为png或者jpg或者jpeg格式!");
return;
}
var reader = new FileReader();
reader.readAsDataURL(f);
reader.onload = function (e) {
console.log(e)
console.log(this)
var img = document.getElementById('test');
var img2 = document.getElementById('test2');
img.src = this.result;
var quality = .8;
var compressImg = Upload.compress(img,quality);
img2.src = compressImg
}
}
}
},
change2: function() {
var file_arr = file.files;
var ul = $(".weui_uploader_files");
if(file_arr.length < 7) {
for(var key in file_arr) {
if(file_arr.hasOwnProperty(key)) {
var f = file_arr[key];
var url = URL.createObjectURL(f);
var reader = new FileReader();
reader.readAsDataURL(f);
n +=1;
if(n < 7) {
reader._onload = function(e) {
// 拼接显示预览图片的html
var list = $("<li class='weui_uploader_file' style='position: relative'>" +
"<img id='preview" + n + "' class=preview_li' style='width: 100%;height: 100%'>" +
"<span id='delImg" + n+ "' style='position: absolute; top: 0; right: 4px; color: #e4007f'>X</span></li>");
ul.append(list);
// 将转化后的图片地址放在img中
var pic = document.getElementById('preview' + n);
//pic.src = this.result;
pic.src=url;
console.log(reader);
images.push(f);
document.getElementById('delImg' + n).addEventListener("click", function () {
$(this).parent().remove();
});
return {
images:images
};
};
reader._onload();
}else {
$.alert("最多上传6张图片");
}
}
}
}else {
$.alert("最多上传6张图片");
}
},
compress: function (source_img, quality, output_img_type) {
var mime_type = "image/jpeg";
if(output_img_type!=undefined && output_img_type=="image/png"){
mime_type = "image/png";
}
var max = 1000; // 设置最大分辨率
var c_w = '';
var c_h = '';
var width = source_img.width;
var height = source_img.height;
// 等比例缩放
if (width > max || height > max) {
if (width > height) {
c_w = max;
c_h = max * height / width;
} else {
c_h = max;
c_w = max * width / height;
}
}else { // 不缩放
c_w = width;
c_h = height;
}
var canvas = document.createElement('canvas');
canvas.width = c_w;
canvas.height = c_h;
var ctx = canvas.getContext('2d');
ctx.drawImage(source_img,0,0, width, height, 0, 0, c_w, c_h);
var outputUrl = canvas.toDataURL(mime_type, quality);
return outputUrl;
},
submit: function () {
}
};
document.getElementById('upload_input').addEventListener('change',Upload.change);
}
DEMO效果预览:

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript图片操作技巧大全》、《JavaScript切换特效与技巧总结》、《JavaScript运动效果与技巧汇总》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。