2

彩度を下げる必要がある透明度のある .png があります。ビットマップの平均R、G、B値を取得する必要があることを読み、次を使用します。

G*.59
R*.3
B*.11

この方法で平均色を計算します。

private Color Average_Color(Bitmap bitmap) {
  Color c = new Color();
  int pixel_number = 0;
  int r = 0;
  int g = 0;
  int b = 0;

  for (int i = 0; i < bitmap.Width; i++) {
    for (int j = 0; j < bitmap.Height; j++) {
      c = bitmap.GetPixel(i, j);
        r += c.R;
        g += c.G;
        b += c.B;
        pixel_number++;
    }
  }
  c = Color.FromArgb(1, r / pixel_number, g / pixel_number, b / pixel_number);
  return c;
}

次に、最初にテクスチャをペイントするために、次のように色を設定します。

rgb = Average(bitmap);
GL.Color3(rgb.R * 0.59, rgb.G * 0.3, rgb.B * 0.11);
//here I draw my texture

理由はわかりませんが、機能しません (元の色のテクスチャが得られます)。で何かが間違っていると思いAverage_Colorます。たぶん、完全に不透明なビットマップではないからでしょうか?

4

2 に答える 2

1

OpenGL は、その色が 0 から 1 に正規化されたフロートであることを期待していますが、ビットマップが 0 から 255 の色を報告していると思われます。

したがって、1 よりもはるかに大きい RGB 値を glColor に渡していると仮定します。これは 1 にクランプされるため、テクスチャは同じように見えます。

試す

GL.Color3(rgb.R*0.59/255.f, rgb.G*0.3/255.f, rgb.B*0.11/255.f);

于 2012-07-18T22:31:10.400 に答える
0

除算の前に変数を float にキャストしてみてください

于 2012-07-18T23:14:40.427 に答える