js前端實(shí)現(xiàn)圖片壓縮上傳的示例代碼
這里有兩張圖片,它們表面看上去是一模一樣的,但實(shí)際上各自所占用的內(nèi)存大小相差了180倍。
可以看到右邊的圖片是22.3MB,而左側(cè)的圖片只有127KB,但是實(shí)際上這兩張圖片的大小都是22.3MB。
最近在開(kāi)發(fā)中遇到這樣的一個(gè)需求,需要把用戶上傳的圖片先進(jìn)行一次壓縮,然后再保存到服務(wù)器,這里我們除了優(yōu)先考慮壓縮圖片的大小外,還要顧及圖片壓縮后的清晰度問(wèn)題。
經(jīng)過(guò)對(duì)比,圖片并沒(méi)有明顯的失真情況,下面給大家分享一下,我的解決方法:
這里我采用element的文件上傳控件來(lái)上傳圖片
<el-upload class="avatar-uploader" :action="GLOBAL.serverFileUrl" name="file" drag :show-file-list="false" :on-change="beforeAvatarUpload" > <i class="el-icon-plus avatar-uploader-icon"></i> </el-upload>
定義了三個(gè)事件方法
//圖片上傳之前處理事件 beforeAvatarUpload(file) { console.log(file); const isJpgPng = file.raw.type === "image/jpeg" || file.raw.type === "image/png"; if (!isJpgPng ) { this.GLOBAL.messageEvent("error","上傳頭像圖片只能是 JPG/PNG 格式!"); } else { this.compressImg(file.raw); } return isJpgPng; },
compressImg(file) { let that = this; // ?通過(guò)FormData構(gòu)造函數(shù)創(chuàng)建一個(gè)空對(duì)象 let formData = new FormData(); let reader = new FileReader(); // ?將讀取到的文件編碼成DataURL reader.readAsDataURL(file); // ?壓縮圖片 reader.onload = function(ev) { try { // ?讀取圖片來(lái)獲得上傳圖片的寬高 let img = new Image(); img.src = ev.target.result; img.onload = function(ev) { // ?將圖片繪制到canvas畫(huà)布上進(jìn)行壓縮 let canvas = document.createElement("canvas"); let context = canvas.getContext("2d"); let imgwidth = img.width; let imgHeight = img.height; // ?按比例縮放后圖片寬高; let targetwidth = imgwidth; let targetHeight = imgHeight; // ?/如果原圖寬大于最大寬度 if (targetWidth > targetHeight) { // ?原圖寬高比例 let scale = targetHeight / 1280; targetHeight = 1280; targetWidth' = targetwidth / scale; } else { // ?原圖寬高比例 let scale = targetWidth / 1280; targetWidth = 1280; targetHeight = targetHeight / scale; } // ?縮放后高度仍然大于最大高度繼續(xù)按比例縮小 canvas.width = targetwidth; //canvas的寬=圖片的寬 canvas.height = targetHeight; //canvas的高=圖片的高 context.clearRect(0,0, canvas.width, canvas.height); context.drawImage(this, 0, 0, canvas.width, canvas.height); let data = "": // ?如果圖片小于0.6Mb,不進(jìn)行壓縮,并返回二進(jìn)制流 if (file.size <= 628288) { data = canvas.toDataURL("image/jpeg"); formData.append("file", file); that.handleChange(file); } // ?如果圖片大于e.6Mb,進(jìn)行壓縮,并返回二進(jìn)制流 else { // todo 壓縮文件大小比例 data = canvas.toDataURL("image/jpeg",0.4); let paper = that.GLOBAL.dataURLtoFile(data, file.name); formData.append("file", paper); that.handleChange(paper); } }; } catch (error) { console.log("出現(xiàn)錯(cuò)誤",error); } }; },
// todo 調(diào)用上傳接口 文件提交給后臺(tái) handleChange(file) ( let formData = new FormData( ); formData.append("file",file.raw || file); console.log(formData); brandServices.uploadFile(formData).then(res => { if (res.data.errno === 0) { this.imgUrl = res.data.data; this.dialogImageUrl = URL.createObjectURL(file); this.GLOBAL.messageEvent("success",res.data.message); } else { this.GLOBAL .messageEvent("error",res .data.message); } }); }
總結(jié):
先進(jìn)行圖片上傳前的驗(yàn)證;接著再對(duì)圖片實(shí)現(xiàn)壓縮的操作;最后就可以把文件流提交給后臺(tái)。
具體的思路是:通過(guò)FormData構(gòu)造函數(shù)創(chuàng)建一個(gè)空對(duì)象,將圖片繪制到canvas畫(huà)布上,然后再進(jìn)行壓縮。用戶上傳的文件超過(guò)一定的大小后就可以執(zhí)行壓縮的操作,當(dāng)然如果圖片太小的話,我們就沒(méi)必要再壓了。建議采用寬高等比例的方式來(lái)壓縮,不然可能會(huì)出現(xiàn)圖片變形的情況。
到此這篇關(guān)于js前端實(shí)現(xiàn)圖片壓縮上傳的示例代碼的文章就介紹到這了,更多相關(guān)js圖片壓縮上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript 正則表達(dá)式中g(shù)lobal模式的特性
這篇文章主要介紹了JavaScript 正則表達(dá)式中g(shù)lobal模式的特性 的相關(guān)資料,需要的朋友可以參考下2016-02-02TypeScript中的交叉類型和聯(lián)合類型示例講解
交叉類型簡(jiǎn)單來(lái)說(shuō)就是通過(guò)&符號(hào)將多個(gè)類型進(jìn)行合并成一個(gè)類型,然后用type來(lái)聲明新生成的類型,聯(lián)合類型和交叉類型比較相似,聯(lián)合類型通過(guò)|符號(hào)連接多個(gè)類型從而生成新的類型,本文就這兩個(gè)類型結(jié)合示例代碼詳細(xì)講解,感興趣的朋友跟隨小編一起學(xué)習(xí)吧2022-12-12JS實(shí)現(xiàn)求數(shù)組起始項(xiàng)到終止項(xiàng)之和的方法【基于數(shù)組擴(kuò)展函數(shù)】
這篇文章主要介紹了JS實(shí)現(xiàn)求數(shù)組起始項(xiàng)到終止項(xiàng)之和的方法,基于數(shù)組擴(kuò)展函數(shù)實(shí)現(xiàn)該功能,涉及javascript針對(duì)數(shù)組的簡(jiǎn)單判斷、遍歷等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06JavaScript 異步方法隊(duì)列鏈實(shí)現(xiàn)代碼分析
在javascript中,方法的鏈?zhǔn)秸{(diào)用很流行,使用jQuery的朋友對(duì)此一定深有體會(huì)。2010-06-06js實(shí)現(xiàn)按鈕控制帶有停頓效果的圖片滾動(dòng)
這篇文章主要介紹了js實(shí)現(xiàn)按鈕控制帶有停頓效果的圖片滾動(dòng),,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08TensorFlow.js機(jī)器學(xué)習(xí)預(yù)測(cè)鳶尾花種類
TensorFlow.js是一個(gè)開(kāi)源的基于硬件加速的JavaScript庫(kù),用于訓(xùn)練和部署機(jī)器學(xué)習(xí)模型。本教程將會(huì)帶大家簡(jiǎn)單了解和使用TensorFlow.js框架實(shí)現(xiàn)預(yù)測(cè)鳶尾花種類2022-11-11