如何用JS將base64圖片壓縮至指定大小
在開發(fā)中,通常在上傳圖片時,由于各種限制,需要將上傳的圖片壓縮到某一大小范圍內(nèi)才能上傳。在此提供以下方法實(shí)現(xiàn)該需求,復(fù)制可用。
壓縮圖片原理
- 通過原生的input標(biāo)簽?zāi)玫揭蟼鞯膱D片文件
- 將圖片文件file對象轉(zhuǎn)化成圖片base64
- 根據(jù)圖片base64創(chuàng)建img圖片對象
- 在canvas上繪制該HTMLImageElement
- 通過不斷降低圖片質(zhì)量指數(shù)來達(dá)到壓縮圖片大小的目的
封裝
將以上代碼封裝為一個js文件,這里命名為compressImg.js,放置在utils文件夾下
/** * 壓縮圖片到指定大小 * @param baseImg base64圖片 * @param maxSize 單位kb */ export function compressImgBySize (baseImg, maxSize = 200) { return new Promise((resolve) => { // 計(jì)算圖片大小 const strLength = baseImg.length const fileLength = parseInt(strLength - (strLength / 8) * 2) let size = parseInt((fileLength / 1024).toFixed(2)) // 判斷圖片是否符合指定大小要求 if (size <= maxSize) { resolve(baseImg) return } // 創(chuàng)建image對象 const img = new Image() if (baseImg.indexOf('data:image/') !== -1) { img.src = baseImg } else { img.src = 'data:image/jpeg;base64,' + baseImg } img.onload = () => { // 把image對象 轉(zhuǎn)換為 canvas對象 const canvas = imgToCanvas(img) let resUrl = '' // 圖片質(zhì)量,范圍:0 ~ 1 let quality = 0.9 // 當(dāng)圖片大小大于指定maxSize,圖片質(zhì)量大于0時繼續(xù)通過降低圖片資料來壓縮 while (size > maxSize && quality > 0) { // 在canvas上繪制該HTMLImageElement,得到圖片base64 resUrl = canvas.toDataURL('image/jpeg', quality).replace(/^data:image\/\w+;base64,/, '') const resLength = resUrl.length // 計(jì)算繪制出的base64圖片大小 const resFileLength = parseInt(resLength - (resLength / 8) * 2) size = parseInt((resFileLength / 1024).toFixed(2)) // 降低圖片質(zhì)量 quality = (quality - 0.1).toFixed(1) } resolve(resUrl) } img.onerror = () => { resolve(baseImg) } }) } // 把image 轉(zhuǎn)換為 canvas對象 export function imgToCanvas (image) { var canvas = document.createElement('canvas') canvas.width = image.width canvas.height = image.height canvas.getContext('2d').drawImage(image, 0, 0) return canvas }
在需要使用圖片壓縮的.vue文件中引入并使用,如下
// 注意引入路徑是否正確 import { compressImgBySize } from '@/utils/compressImg' // this.applyFile[0].content 為指定的base64格式照片 // 1200 指將圖片壓縮到1200kb大小以下 compressImgBySize('file文件對象', 1200).then(baseImg => { // 輸出圖片base64 console.log(baseImg) })
附:js圖片轉(zhuǎn)base64
toBase64(file){//轉(zhuǎn)base64 let base64='' const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = (e) => { // 轉(zhuǎn)換完成,獲取Base64編碼 this.imgBase64 = e.target.result; if(this.imgBase64){ this.suofang(this.imgBase64,this.getImgList) } // 這里可以根據(jù)需要對base64進(jìn)行處理,比如存儲到Vuex、Data等 return base64 } },
總結(jié)
到此這篇關(guān)于如何用JS將base64圖片壓縮至指定大小的文章就介紹到這了,更多相關(guān)JS將base64圖片壓縮指定大小內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript 全面解析各種瀏覽器網(wǎng)頁中的JS 執(zhí)行順序
近來我通過一些測試以全面的解析網(wǎng)頁在各種瀏覽器中的JavaScript代碼的執(zhí)行順序,在這兒做個記錄。2009-02-02javascript中String類的subString()方法和slice()方法
最近在看《Javascript高級程序設(shè)計(jì)》一書,在書中發(fā)現(xiàn)一些以前沒有接觸過的且比較實(shí)用的技巧和知識點(diǎn),想通過博客記錄一下,以加深記憶。2011-05-05js獲取異步函數(shù)數(shù)據(jù)的實(shí)現(xiàn)
本文主要介紹了js獲取異步函數(shù)數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Java?@Schema和@ApiModel等注解的聯(lián)系淺析
這篇文章主要給大家介紹了關(guān)于Java?@Schema和@ApiModel等注解的聯(lián)系的相關(guān)資料,我在看公司之前的文檔,發(fā)現(xiàn)了@schema注解,不太了解,所以查詢了一些資料,把我的見解記錄下,需要的朋友可以參考下2023-08-08js實(shí)現(xiàn)input密碼框顯示/隱藏功能
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)input密碼框顯示和隱藏功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-10-10JS實(shí)現(xiàn)不規(guī)則TAB選項(xiàng)卡效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)不規(guī)則TAB選項(xiàng)卡效果代碼,通過簡單的JavaScript響應(yīng)鼠標(biāo)事件動態(tài)變換元素樣式實(shí)現(xiàn)不規(guī)則選項(xiàng)卡效果,非常具有實(shí)用價值,需要的朋友可以參考下2015-09-09document.onreadystatechange事件的用法分析
這里主要介紹document.onreadystatechange事件的使用方法, 一般多用于實(shí)時監(jiān)控用戶的輸入2009-10-10JavaScript數(shù)組方法之findIndex()的用法詳解
findIndex()方法是一個非常實(shí)用的數(shù)組方法,可以幫助我們快速查找符合某個條件的元素,本文給大家介紹JavaScript數(shù)組方法之findIndex()的用法,感謝的朋友跟隨小編一起看看吧2023-10-10