2013-04-25 51 views
0

使用EasyBMP库(无论如何都是紧密适应),我有代码将BMP转换为灰度。将BMP转换为纯RGB,无彩色地图?

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。

回答

1

This page表明在16位深度图像上不使用调色板。所以我尝试将位深度改为32,并且它工作。 24也工作。所以这似乎是答案:使用更高的位深度,并且不需要调色板,而是将原样使用RGB值。

0

我的猜测是你的monocromeValue(...)功能溢出而被咬伤。正如你在括号中一起添加3个u8值一样,我不认为编译器会将这些增量上转换成一个更大的整数类型。我会尝试:

int monochromeValue (RGBApixel foo) 
{ 
    return ((int)foo.Red+(int)foo.Green+(int)foo.Blue)/3; 
} 

作为一个测试,以确保虽然。

+0

好的。它不能解决问题(如果你考虑这个问题,它不会 - 因为新的R,G和B值仍然是相同的,即使关闭了。但我确实包含了你的修正 - 谢谢。 – 2013-04-25 23:19:01