111 lines
1.1 KiB
TypeScript
111 lines
1.1 KiB
TypeScript
const DIGIT_CHARACTERS = [
|
|
'0',
|
|
'1',
|
|
'2',
|
|
'3',
|
|
'4',
|
|
'5',
|
|
'6',
|
|
'7',
|
|
'8',
|
|
'9',
|
|
'A',
|
|
'B',
|
|
'C',
|
|
'D',
|
|
'E',
|
|
'F',
|
|
'G',
|
|
'H',
|
|
'I',
|
|
'J',
|
|
'K',
|
|
'L',
|
|
'M',
|
|
'N',
|
|
'O',
|
|
'P',
|
|
'Q',
|
|
'R',
|
|
'S',
|
|
'T',
|
|
'U',
|
|
'V',
|
|
'W',
|
|
'X',
|
|
'Y',
|
|
'Z',
|
|
'a',
|
|
'b',
|
|
'c',
|
|
'd',
|
|
'e',
|
|
'f',
|
|
'g',
|
|
'h',
|
|
'i',
|
|
'j',
|
|
'k',
|
|
'l',
|
|
'm',
|
|
'n',
|
|
'o',
|
|
'p',
|
|
'q',
|
|
'r',
|
|
's',
|
|
't',
|
|
'u',
|
|
'v',
|
|
'w',
|
|
'x',
|
|
'y',
|
|
'z',
|
|
'#',
|
|
'$',
|
|
'%',
|
|
'*',
|
|
'+',
|
|
',',
|
|
'-',
|
|
'.',
|
|
':',
|
|
';',
|
|
'=',
|
|
'?',
|
|
'@',
|
|
'[',
|
|
']',
|
|
'^',
|
|
'_',
|
|
'{',
|
|
'|',
|
|
'}',
|
|
'~',
|
|
];
|
|
|
|
export const decode83 = (str: string) => {
|
|
let value = 0;
|
|
let digit;
|
|
|
|
for (const c of str) {
|
|
digit = DIGIT_CHARACTERS.indexOf(c);
|
|
value = value * 83 + digit;
|
|
}
|
|
|
|
return value;
|
|
};
|
|
|
|
export const intToRGB = (int: number) => ({
|
|
r: Math.max(0, int >> 16),
|
|
g: Math.max(0, (int >> 8) & 255),
|
|
b: Math.max(0, int & 255),
|
|
});
|
|
|
|
export const getAverageFromBlurhash = (blurhash: string) => {
|
|
if (!blurhash) {
|
|
return null;
|
|
}
|
|
|
|
return intToRGB(decode83(blurhash.slice(2, 6)));
|
|
};
|