javascript實現(xiàn)移動端 HTML5 圖片上傳預覽和壓縮功能示例
本文實例講述了javascript實現(xiàn)移動端 HTML5 圖片上傳預覽和壓縮功能。分享給大家供大家參考,具體如下:
在開發(fā)移動端web網(wǎng)頁中,我們不可避免的會遇到文件上傳的功能,但由于手機圖片尺寸太大,上傳時間過長導致用戶體驗太差,就需要在上傳前對圖片進行一定的壓縮。
在代碼之前,有必要先了解我們即將使用到的幾個API
file 和 FileList 對象
file對象可以用來獲取某個文件的信息,還可以用來讀取這個文件的內(nèi)容.通常情況下,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應用程序使用它可以異步的讀取存儲在用戶計算機上的文件(或者原始數(shù)據(jù)緩沖)內(nèi)容。
1、具體使用之前,我們應先創(chuàng)建一個FileReader 對象
var reader = new FileReader()
2、然后讀取一個文件,共有四種方式,這里只介紹我們最常使用的一個:
reader.readAsDataURL(fs); // var fs = document.getElementById("text").files
3、在 onload 事件中觸發(fā)回調(diào)
reader.onload = function (e) {
console.log(e)
console.log(this)
}
// this.result 是一個base64 格式的圖片地址
HTMLCanvasElement.toDataURL()
HTMLCanvasElement.toDataURL() 方法返回一個包含圖片展示的 data URI 。可以使用 type 參數(shù)其類型,默認為 PNG 格式。圖片的分辨率為96dpi。
- 如果畫布的高度或?qū)挾仁?,那么會返回字符串“
data:,”。 - 如果傳入的類型非“
image/png”,但是返回的值以“data:image/png”開頭,那么該傳入的類型是不支持的。 - Chrome支持“
image/webp”類型。
語法
canvas.toDataURL(type, encoderOptions);
參數(shù)
type 可選
圖片格式,默認為 image/png
encoderOptions 可選
在指定圖片格式為 image/jpeg 或 image/webp的情況下,可以從 0 到 1 的區(qū)間內(nèi)選擇圖片的質(zhì)量。如果超出取值范圍, 將會使用默認值 0.92。其他參數(shù)會被忽略。
壓縮
/**
* @param {Object} f input選擇的圖片 必填
* @param {String} quality 圖片壓縮的質(zhì)量[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);
});
}
實例
下面我們就來實現(xiàn)圖片預覽和壓縮功能
HTML結(jié)構(gòu)如下:
<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);
// 將轉(zhuǎn)化后的圖片地址放在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效果預覽:

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript圖片操作技巧大全》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript運動效果與技巧匯總》、《JavaScript動畫特效與技巧匯總》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學運算用法總結(jié)》
希望本文所述對大家JavaScript程序設計有所幫助。
相關(guān)文章
微信小程序?qū)崿F(xiàn)單個卡片左滑顯示按鈕并防止上下滑動干擾功能
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)單個卡片左滑顯示按鈕并防止上下滑動干擾功能,利用小程序事件處理的api,分別讀取觸摸開始,觸摸移動時,觸摸結(jié)束的X/Y坐標,根據(jù)差值來改變整個卡片的位置,具體實例代碼跟隨小編一起看看吧2019-12-12
一個不錯的仿攜程自定義數(shù)據(jù)下拉選擇select
這是一個仿攜程自定義的數(shù)據(jù)下拉選擇select,對一些比較重要的參數(shù)進行的描述,方便初學者2014-09-09

