Files
WebChat/src/utils/generateRandomAvatar.ts

32 lines
1.3 KiB
TypeScript
Raw Normal View History

2024-09-22 03:25:55 +08:00
import generateUglyAvatar from '@/lib/uglyAvatar'
2025-05-21 21:18:29 +08:00
import type { ImageType } from './compressImage'
import compressImage from './compressImage'
2024-09-22 03:25:55 +08:00
2024-11-05 17:12:32 +08:00
const generateRandomAvatar = async (targetSize: number, outputType: ImageType = 'image/webp') => {
2024-09-22 03:25:55 +08:00
const svgBlob = generateUglyAvatar()
// compressImage can't directly compress svg, need to convert to jpeg first
2024-09-24 15:02:12 +08:00
const imageBlob = await new Promise<Blob>((resolve, reject) => {
2024-09-22 03:25:55 +08:00
const image = new Image()
image.onload = async () => {
const canvas = new OffscreenCanvas(image.width, image.height)
const ctx = canvas.getContext('2d')
ctx?.drawImage(image, 0, 0)
2024-11-05 17:12:32 +08:00
const blob = await canvas.convertToBlob({ type: outputType })
2024-09-22 03:25:55 +08:00
resolve(blob)
}
image.onerror = () => reject(new Error('Failed to load SVG'))
image.src = URL.createObjectURL(svgBlob)
})
2024-11-05 17:12:32 +08:00
const miniAvatarBlob = await compressImage({ input: imageBlob, targetSize, outputType })
2024-09-22 03:25:55 +08:00
const miniAvatarBase64 = await new Promise<string>((resolve, reject) => {
const reader = new FileReader()
reader.onload = (e) => resolve(e.target?.result as string)
reader.onerror = () => reject(new Error('Failed to convert Blob to Base64'))
reader.readAsDataURL(miniAvatarBlob)
})
return miniAvatarBase64
}
export default generateRandomAvatar