如何用JS將base64圖片壓縮至指定大小
在開發(fā)中,通常在上傳圖片時,由于各種限制,需要將上傳的圖片壓縮到某一大小范圍內(nèi)才能上傳。在此提供以下方法實現(xiàn)該需求,復(fù)制可用。
壓縮圖片原理
- 通過原生的input標簽?zāi)玫揭蟼鞯膱D片文件
- 將圖片文件file對象轉(zhuǎn)化成圖片base64
- 根據(jù)圖片base64創(chuàng)建img圖片對象
- 在canvas上繪制該HTMLImageElement
- 通過不斷降低圖片質(zhì)量指數(shù)來達到壓縮圖片大小的目的
封裝
將以上代碼封裝為一個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對象 轉(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
// 計算繪制出的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進行處理,比如存儲到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-02
javascript中String類的subString()方法和slice()方法
最近在看《Javascript高級程序設(shè)計》一書,在書中發(fā)現(xiàn)一些以前沒有接觸過的且比較實用的技巧和知識點,想通過博客記錄一下,以加深記憶。2011-05-05
js獲取異步函數(shù)數(shù)據(jù)的實現(xiàn)
本文主要介紹了js獲取異步函數(shù)數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Java?@Schema和@ApiModel等注解的聯(lián)系淺析
這篇文章主要給大家介紹了關(guān)于Java?@Schema和@ApiModel等注解的聯(lián)系的相關(guān)資料,我在看公司之前的文檔,發(fā)現(xiàn)了@schema注解,不太了解,所以查詢了一些資料,把我的見解記錄下,需要的朋友可以參考下2023-08-08
document.onreadystatechange事件的用法分析
這里主要介紹document.onreadystatechange事件的使用方法, 一般多用于實時監(jiān)控用戶的輸入2009-10-10
JavaScript數(shù)組方法之findIndex()的用法詳解
findIndex()方法是一個非常實用的數(shù)組方法,可以幫助我們快速查找符合某個條件的元素,本文給大家介紹JavaScript數(shù)組方法之findIndex()的用法,感謝的朋友跟隨小編一起看看吧2023-10-10

