将BMP转换为纯RGB,没有颜色映射?

时间:2013-04-25 22:30:02

标签: c bmp

使用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。

2 个答案:

答案 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;
}

作为一个可以肯定的测试。