如何用JS將base64圖片壓縮至指定大小
在開發(fā)中,通常在上傳圖片時,由于各種限制,需要將上傳的圖片壓縮到某一大小范圍內才能上傳。在此提供以下方法實現該需求,復制可用。
壓縮圖片原理
- 通過原生的input標簽拿到要上傳的圖片文件
- 將圖片文件file對象轉化成圖片base64
- 根據圖片base64創(chuàng)建img圖片對象
- 在canvas上繪制該HTMLImageElement
- 通過不斷降低圖片質量指數來達到壓縮圖片大小的目的
封裝
將以上代碼封裝為一個js文件,這里命名為compressImg.js,放置在utils文件夾下
/** * 壓縮圖片到指定大小 * @param baseImg base64圖片 * @param maxSize 單位kb */ export function compressImgBySize (baseImg, maxSize = 200) { return new Promise((resolve) => { // 計算圖片大小 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對象 轉換為 canvas對象 const canvas = imgToCanvas(img) let resUrl = '' // 圖片質量,范圍:0 ~ 1 let quality = 0.9 // 當圖片大小大于指定maxSize,圖片質量大于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 // 計算繪制出的base64圖片大小 const resFileLength = parseInt(resLength - (resLength / 8) * 2) size = parseInt((resFileLength / 1024).toFixed(2)) // 降低圖片質量 quality = (quality - 0.1).toFixed(1) } resolve(resUrl) } img.onerror = () => { resolve(baseImg) } }) } // 把image 轉換為 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圖片轉base64
toBase64(file){//轉base64 let base64='' const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = (e) => { // 轉換完成,獲取Base64編碼 this.imgBase64 = e.target.result; if(this.imgBase64){ this.suofang(this.imgBase64,this.getImgList) } // 這里可以根據需要對base64進行處理,比如存儲到Vuex、Data等 return base64 } },
總結
到此這篇關于如何用JS將base64圖片壓縮至指定大小的文章就介紹到這了,更多相關JS將base64圖片壓縮指定大小內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaScript 全面解析各種瀏覽器網頁中的JS 執(zhí)行順序
近來我通過一些測試以全面的解析網頁在各種瀏覽器中的JavaScript代碼的執(zhí)行順序,在這兒做個記錄。2009-02-02javascript中String類的subString()方法和slice()方法
最近在看《Javascript高級程序設計》一書,在書中發(fā)現一些以前沒有接觸過的且比較實用的技巧和知識點,想通過博客記錄一下,以加深記憶。2011-05-05Java?@Schema和@ApiModel等注解的聯系淺析
這篇文章主要給大家介紹了關于Java?@Schema和@ApiModel等注解的聯系的相關資料,我在看公司之前的文檔,發(fā)現了@schema注解,不太了解,所以查詢了一些資料,把我的見解記錄下,需要的朋友可以參考下2023-08-08document.onreadystatechange事件的用法分析
這里主要介紹document.onreadystatechange事件的使用方法, 一般多用于實時監(jiān)控用戶的輸入2009-10-10JavaScript數組方法之findIndex()的用法詳解
findIndex()方法是一個非常實用的數組方法,可以幫助我們快速查找符合某個條件的元素,本文給大家介紹JavaScript數組方法之findIndex()的用法,感謝的朋友跟隨小編一起看看吧2023-10-10