60 lines
1.7 KiB
JavaScript
60 lines
1.7 KiB
JavaScript
/**
|
||
* 压缩图片到指定大小
|
||
* @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
|
||
}
|
||
|
||
// 创建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时继续通过降低图片资料来压缩
|
||
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
|
||
} |