lobe-chat
1export const imageToBase64 = ({
2size,
3img,
4type = 'image/webp',
5}: {
6img: HTMLImageElement;
7size: number;
8type?: string;
9}) => {
10const canvas = document.createElement('canvas');
11const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;
12let startX = 0;
13let startY = 0;
14
15if (img.width > img.height) {
16startX = (img.width - img.height) / 2;
17} else {
18startY = (img.height - img.width) / 2;
19}
20
21canvas.width = size;
22canvas.height = size;
23
24ctx.drawImage(
25img,
26startX,
27startY,
28Math.min(img.width, img.height),
29Math.min(img.width, img.height),
300,
310,
32size,
33size,
34);
35
36return canvas.toDataURL(type);
37};
38
39export const imageUrlToBase64 = async (
40imageUrl: string,
41): Promise<{ base64: string; mimeType: string }> => {
42try {
43const res = await fetch(imageUrl);
44const blob = await res.blob();
45const arrayBuffer = await blob.arrayBuffer();
46
47const base64 =
48typeof btoa === 'function'
49? btoa(
50new Uint8Array(arrayBuffer).reduce(
51(data, byte) => data + String.fromCharCode(byte),
52'',
53),
54)
55: Buffer.from(arrayBuffer).toString('base64');
56
57return { base64, mimeType: blob.type };
58} catch (error) {
59console.error('Error converting image to base64:', error);
60throw error;
61}
62};
63