blob转为Base64的图片
- blob 二进制文件流
- blobType MIME类型
- return Base64格式的字符串
export function blobToBase64(blob: Blob, blobType?:string):Promise<ArrayBuffer | string | null>{
return promise((resolve, reject) => {
let blobInstance = null
if(!blobType) blobInstance = blob
else blobInstance = new Blob([blob], {type: blobType})
const render = new FileReader()
render.readAsDataURL(blobInstance)
render.onload = () => resolve(render.result)
render.onerror = error => reject(error)
}
压缩File类型的图片
- file: File类型的图片
- maxW: 最大的图片宽度
- quality 图片质量(0-1, 数值越低,图片越模糊)
- return Base64格式的字符串
export async function compressImg(file: File, maxW = 400, quality = 0.2): Promise<string>{
const result: any = await blobToBase64(file)
const fileSize = +(Number(file['size']) / 1024 / 1024).toFixed(4)
const image = new Image()
image.src = result
return new Promise(resolve => {
image.onload = () => {
const maxWidth = maxW
const originWidth = image.width
const originHeight = image.height
let targetWidth = originWidth
let targetHeight = originHeight
if(originWidth > maxWidth){
targetWidth = maxWidth
targetHeight = Math.round(maxWidth * (originHeight / originWidth))
}
const canvas = document.createElement('canvas')
const context = canvas.getContext('2d')!
let compressedBase64 = ''
canvas.width = targetWidth
canvas.height = targetHeight
context.drawImage(image, 0, 0, targetWidth, targetHeight)
if(fileSize < 1) compressedBase64 = canvas.toDataToURL(file['type'], 0.6)
else compressedBase64 = canvas.toDataURL(file['type'], quality)
resolve(compressedBase64)
}
})
}
下载二进制文件流
export function download(blob: Blob, name: string): void{
if(blob?.type === 'application/json'){
msgError('导出失败')
throw new TypeError('文件类型错误')
}
const a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.download = name
a.click()
URL.resolveObjectURL(a.href)
}