-
Notifications
You must be signed in to change notification settings - Fork 62
Expand file tree
/
Copy pathcanvasDataToGrayscale.ts
More file actions
51 lines (41 loc) · 1.32 KB
/
canvasDataToGrayscale.ts
File metadata and controls
51 lines (41 loc) · 1.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
const RED_PREFERENCE = 0.1;
const WEIGHTS = {
r: 0.299 + RED_PREFERENCE,
g: 0.587 + RED_PREFERENCE * -0.5,
b: 0.114 + RED_PREFERENCE * -0.5,
};
export function canvasDataToGrayscale(canvasData: ImageData): {
canvasData: ImageData;
averageLightness: number;
} {
let pixels = canvasData.data;
let minLightness = Infinity;
let maxLightness = 0;
let averageLightness = 0;
for (let i = 0; i < pixels.length; i += 4) {
let lightness =
pixels[i] * WEIGHTS.r +
pixels[i + 1] * WEIGHTS.g +
pixels[i + 2] * WEIGHTS.b;
if (pixels[i + 3] < 128) {
lightness = 255;
}
minLightness = Math.min(minLightness, lightness);
maxLightness = Math.max(maxLightness, lightness);
averageLightness += lightness;
}
averageLightness = Math.round(averageLightness / (pixels.length / 4));
minLightness += 32;
maxLightness -= 32;
const contrast = 255 / (maxLightness - minLightness);
for (let i = 0; i < pixels.length; i += 4) {
let lightness =
pixels[i] * WEIGHTS.r +
pixels[i + 1] * WEIGHTS.g +
pixels[i + 2] * WEIGHTS.b;
pixels[i] = Math.round(lightness * contrast) - minLightness;
pixels[i + 1] = Math.round(lightness * contrast) - minLightness;
pixels[i + 2] = Math.round(lightness * contrast) - minLightness;
}
return { canvasData, averageLightness };
}