使用EasyBMP库(无论如何都是近距离调整),我有代码将BMP转换为灰度。
int monochromeValue (RGBApixel foo)
{
return (foo.Red+foo.Green+foo.Blue)/3;
}
void setToColor (RGBApixel* loc, int newColor)
{
loc->Red = loc->Green = loc->Blue = newColor;
}
void greyscaleImage (BMP* image)
{
int x, y;
for (x = 0; x < image->Width; ++x)
for (y = 0; y < image->Height; ++y)
{
RGBApixel* pixel = elementAt (image, x, y);
setToColor (pixel, monochromeValue (*pixel));
}
}
RGBA像素是
typedef unsigned char ebmpBYTE;
typedef struct RGBApixel
{
ebmpBYTE Blue;
ebmpBYTE Green;
ebmpBYTE Red;
ebmpBYTE Alpha;
} RGBApixel;
代码不会使其成为灰度。一个图像是棕褐色,另一个是灰度,但有一些彩色高光。
我认为这与色彩图有关。我该怎么做才能使它只使用RGB而不通过调色板运行? (如果可以的话,改变位深度很好。)
TIA。
答案 0 :(得分:1)
This page表明调色板不适用于16位以上的深度图像。所以我尝试将位深度更改为32,并且它有效。 24也工作。所以这似乎就是答案:使用更高的位深度,它不需要调色板,而是使用RGB值。
答案 1 :(得分:0)
我的猜测是你的monocromeValue(...)
功能被溢出所困扰。当您在括号中一起添加3个u8值时,我认为编译器不会将添加转换为更大的整数类型。我会尝试:
int monochromeValue (RGBApixel foo)
{
return ((int)foo.Red+(int)foo.Green+(int)foo.Blue)/3;
}
作为一个可以肯定的测试。