The weeb for the next gen discord boat - Wamellow
wamellow.com
bot
discord
1import sharp from "sharp";
2
3const cache = new Map<string, string>();
4
5export default async function getAverageColor(url: string) {
6
7 const cached = cache.get(url);
8 if (cached) return cached;
9
10 const { data, info } = await sharp(
11 await (await fetch(url)).arrayBuffer()
12 )
13 .raw()
14 .toBuffer({ resolveWithObject: true })
15 .catch(() => ({ data: null, info: null }));
16
17 if (!data || !info) return null;
18
19 const { width, height } = info;
20 const pixelCount = width * height;
21
22 let redSum = 0;
23 let greenSum = 0;
24 let blueSum = 0;
25
26 for (let i = 0; i < data.length; i += 4) {
27 if ((data[i] + data[i + 1] + data[1 + 2]) < 10) continue;
28
29 redSum += data[i];
30 greenSum += data[i + 1];
31 blueSum += data[i + 2];
32 }
33
34 const rgb = {
35 r: Math.round(redSum / pixelCount),
36 g: Math.round(greenSum / pixelCount),
37 b: Math.round(blueSum / pixelCount)
38 };
39
40 const hex = `#${rgb.r.toString(16).padStart(2, "0")}${rgb.g.toString(16).padStart(2, "0")}${rgb.b.toString(16).padStart(2, "0")}`;
41 cache.set(url, hex);
42
43 return hex;
44}