2013-04-25 47 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