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;

コードはグレースケールにしません。1 つのイメージはよりセピア色で、もう 1 つのイメージはほぼグレースケールですが、色付きのハイライトがいくつかあります。

これはカラーマップと関係があると思います。パレットを介さずに RGB のみを使用するようにするにはどうすればよいですか? (ビット深度を変更しても問題ありません。)

ティア。

4

2 に答える 2

0

私の推測では、monocromeValue(...)関数のオーバーフローに噛まれています。括弧内に 3 つの u8 値を追加しているため、コンパイラが追加をより大きな整数型にアップコンバートするとは思わない。私は試してみます:

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

ただし、確認のためのテストとして。

于 2013-04-25T22:36:03.650 に答える