javascript實現(xiàn)移動端 HTML5 圖片上傳預(yù)覽和壓縮功能示例
本文實例講述了javascript實現(xiàn)移動端 HTML5 圖片上傳預(yù)覽和壓縮功能。分享給大家供大家參考,具體如下:
在開發(fā)移動端web網(wǎng)頁中,我們不可避免的會遇到文件上傳的功能,但由于手機(jī)圖片尺寸太大,上傳時間過長導(dǎo)致用戶體驗太差,就需要在上傳前對圖片進(jìn)行一定的壓縮。
在代碼之前,有必要先了解我們即將使用到的幾個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 (中國標(biāo)準(zhǔn)時間) name:"1.png" size:22177 type:"image/png" webkitRelativePath:""
FileReader
FileReader,web應(yīng)用程序使用它可以異步的讀取存儲在用戶計算機(jī)上的文件(或者原始數(shù)據(jù)緩沖)內(nèi)容。
1、具體使用之前,我們應(yīng)先創(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ù)其類型,默認(rèn)為 PNG 格式。圖片的分辨率為96dpi。
- 如果畫布的高度或?qū)挾仁?,那么會返回字符串“
data:,”。
- 如果傳入的類型非“
image/png
”,但是返回的值以“data:image/png
”開頭,那么該傳入的類型是不支持的。 - Chrome支持“
image/webp
”類型。
語法
canvas.toDataURL(type, encoderOptions);
參數(shù)
type
可選
圖片格式,默認(rèn)為 image/png
encoderOptions
可選
在指定圖片格式為 image/jpeg 或
image/webp的情況下,可以從 0 到 1 的區(qū)間內(nèi)選擇圖片的質(zhì)量
。如果超出取值范圍, 將會使用默認(rèn)值 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; // 設(shè)置最大分辨率 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)圖片預(yù)覽和壓縮功能
HTML結(jié)構(gòu)如下:
<div class="upload"> <p>上傳圖片</p> <form> <input multiple id="upload_input" type="file" /> </form> <h4>原圖預(yù)覽</h4> <img src="" id="test"> <h4>壓縮后預(yù)覽</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) { // 拼接顯示預(yù)覽圖片的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; // 設(shè)置最大分辨率 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效果預(yù)覽:
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript圖片操作技巧大全》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript運(yùn)動效果與技巧匯總》、《JavaScript動畫特效與技巧匯總》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
相關(guān)文章
微信小程序?qū)崿F(xiàn)單個卡片左滑顯示按鈕并防止上下滑動干擾功能
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)單個卡片左滑顯示按鈕并防止上下滑動干擾功能,利用小程序事件處理的api,分別讀取觸摸開始,觸摸移動時,觸摸結(jié)束的X/Y坐標(biāo),根據(jù)差值來改變整個卡片的位置,具體實例代碼跟隨小編一起看看吧2019-12-12JavaScript 預(yù)解析的4種實現(xiàn)方法解析
這篇文章主要介紹了JavaScript 預(yù)解析的4種實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09一個不錯的仿攜程自定義數(shù)據(jù)下拉選擇select
這是一個仿攜程自定義的數(shù)據(jù)下拉選擇select,對一些比較重要的參數(shù)進(jìn)行的描述,方便初學(xué)者2014-09-09