摘要:由于圖片壓縮中使用了大量異步操作,這里使用語(yǔ)法處理異步問題基本思路是先將數(shù)據(jù)讀取為類型的數(shù)據(jù),再將繪制到,通過的轉(zhuǎn)換為數(shù)據(jù)并壓縮數(shù)據(jù),最后再將數(shù)據(jù)轉(zhuǎn)換為數(shù)據(jù)類型,再上傳到服務(wù)器。下面是具體的實(shí)現(xiàn)方式。
由于圖片壓縮中使用了大量異步操作,這里使用es7 async 語(yǔ)法處理異步問題
基本思路是:先將file數(shù)據(jù)讀取為DataUrl類型的數(shù)據(jù),再將DataUrl繪制到canvas,1.讀取file轉(zhuǎn)換為DataUrl
通過canvas的apitoDataURL轉(zhuǎn)換為base64數(shù)據(jù)并壓縮數(shù)據(jù),最后再將base64數(shù)據(jù)轉(zhuǎn)換
為blob數(shù)據(jù)類型,再上傳到服務(wù)器。整個(gè)流程就完成了。下面是具體的實(shí)現(xiàn)方式。
async function fileLoad(file){ return new Promise((resolve)=>{ let ready = new FileReader(); /*開始讀取指定的Blob對(duì)象或File對(duì)象中的內(nèi)容. 當(dāng)讀取操作完成時(shí), readyState屬性的值會(huì)成為DONE,如果設(shè)置了onloadend事件處理程序, 則調(diào)用之.同時(shí),result屬性中將包含一個(gè)data: URL格式的字符串以表 示所讀取文件的內(nèi)容.*/ ready.readAsDataURL(file); ready.onload = function () { resolve(this.result); } }) }2.將數(shù)據(jù)繪制到canvas上,壓縮數(shù)據(jù)
async function canvasDataURL(path, obj) { return new Promise((resolve)=>{ let img = new Image(); img.src = path; img.onload = function () { let that = this; // 默認(rèn)按比例壓縮 let w = that.width, h = that.height, scale = w / h; w = obj.width || w; h = obj.height || (w / scale); let quality = 0.7; // 默認(rèn)圖片質(zhì)量為0.7 //生成canvas let canvas = document.createElement("canvas"); let ctx = canvas.getContext("2d"); // 創(chuàng)建屬性節(jié)點(diǎn) let anw = document.createAttribute("width"); anw.nodeValue = w; let anh = document.createAttribute("height"); anh.nodeValue = h; canvas.setAttributeNode(anw); canvas.setAttributeNode(anh); ctx.drawImage(that, 0, 0, w, h); // 圖像質(zhì)量 if (obj.quality && obj.quality <= 1 && obj.quality > 0) { quality = obj.quality; } // quality值越小,所繪制出的圖像越模糊 let base64 = canvas.toDataURL("image/jpeg", quality); // 回調(diào)函數(shù)返回base64的值 resolve(base64); } }); }3.將bas64轉(zhuǎn)換為blob
async function convertBase64UrlToBlob(urlData) { return new Promise((resolve)=>{ let arr = urlData.split(","), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } let blob = new Blob([u8arr], {type: mime}); resolve(blob); }) }4.最后實(shí)現(xiàn)壓縮方法
/** * 三個(gè)參數(shù) * file:一個(gè)是文件(類型是圖片格式), * w:配置對(duì)象 * photoCompress() */ async function photoCompress(file, w) { let re = await fileLoad(file); let base64 = await canvasDataURL(re, w); let blob = await convertBase64UrlToBlob(base64); return new Promise((resolve)=>{ resolve(blob); }) }5.使用方法
async function upload(file) { let form = new FormData(); let fileData = await photoCompress(file, { quality: 0.5 }); form.append("pictrue",fileData,file.name); // 上傳form }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/101715.html
摘要:預(yù)覽因?yàn)轫?xiàng)目是基于做的,本身就提供了的預(yù)覽組件,使用起來也簡(jiǎn)單,如果業(yè)務(wù)需求需要放大縮小,這個(gè)組件就不滿足了。 需求分析 業(yè)務(wù)要求,需要一個(gè)圖片上傳控件,需滿足 多圖上傳 點(diǎn)擊預(yù)覽 圖片前端壓縮 支持初始化數(shù)據(jù) 相關(guān)功能及資源分析 基本功能先到https://www.npmjs.com/search?q=vue+upload上搜索有關(guān)上傳的控件,沒有完全滿足需求的組件,過濾后找到...
摘要:背景作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問題的時(shí)候,都會(huì)虎軀一震,以為會(huì)是一個(gè)棘手的問題,當(dāng)你讀完這篇文章的時(shí)候,你會(huì)發(fā)現(xiàn)都是你瞎操作了,真相就是這么簡(jiǎn)單 背景 作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問題的時(shí)候,都會(huì)虎...
摘要:背景作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問題的時(shí)候,都會(huì)虎軀一震,以為會(huì)是一個(gè)棘手的問題,當(dāng)你讀完這篇文章的時(shí)候,你會(huì)發(fā)現(xiàn)都是你瞎操作了,真相就是這么簡(jiǎn)單 背景 作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問題的時(shí)候,都會(huì)虎...
摘要:背景作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問題的時(shí)候,都會(huì)虎軀一震,以為會(huì)是一個(gè)棘手的問題,當(dāng)你讀完這篇文章的時(shí)候,你會(huì)發(fā)現(xiàn)都是你瞎操作了,真相就是這么簡(jiǎn)單 背景 作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問題的時(shí)候,都會(huì)虎...
閱讀 1867·2021-11-25 09:43
閱讀 3694·2021-11-24 10:32
閱讀 1089·2021-10-13 09:39
閱讀 2341·2021-09-10 11:24
閱讀 3355·2021-07-25 21:37
閱讀 3477·2019-08-30 15:56
閱讀 871·2019-08-30 15:44
閱讀 1460·2019-08-30 13:18