0

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

4

2 回答 2

1

此页面建议不要在 16+ 位深度图像上使用调色板。所以我尝试将位深度更改为 32,并且它起作用了。24 也有效。所以这似乎是答案:使用更高的位深度,它不需要调色板,而是使用原样的 RGB 值。

于 2013-04-26T03:33:19.910 回答
0

My guess is your are being bitten by overflow in your monocromeValue(...) function. As you are adding 3 u8 values together in parenthesis, I don't think the compiler will up-convert the adds to a larger integer type. I would try:

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

As a test to be sure though.

于 2013-04-25T22:36:03.650 回答