-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgreyscale.h
34 lines (29 loc) · 1.15 KB
/
greyscale.h
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
#ifndef CBZ2PDF_GREYSCALE_H
#define CBZ2PDF_GREYSCALE_H
void convertToGrayscale(unsigned char* data, int width, int height, int channels, unsigned char* gsdata) {
for (int i = 0; i < width * height; ++i) {
// Calculate grayscale value using the weighted method (luma)
unsigned char gray = 0;
if (channels == 1 || channels == 2) {
// Grayscale image, no need for conversion
gray = data[i];
if (channels == 2) {
// Grayscale image, no need for conversion
gsdata[i] = data[i + 1];
}
} else if (channels >= 3) {
// RGB or RGBA image
unsigned char r = data[i * channels];
unsigned char g = data[i * channels + 1];
unsigned char b = data[i * channels + 2];
gray = static_cast<unsigned char>(0.21f * r + 0.72f * g + 0.07f * b);
if (channels == 4) {
// Alpha channel exists, preserve it
unsigned char alpha = data[i * channels + 3];
gsdata[i + 1] = alpha;
}
}
gsdata[i] = gray;
}
}
#endif //CBZ2PDF_GREYSCALE_H