C# 去饱和OpenGL纹理

C# 去饱和OpenGL纹理,c#,opengl,colors,grayscale,opentk,C#,Opengl,Colors,Grayscale,Opentk,我有一个透明度为的.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;

我有一个透明度为的.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\u Color
出了问题。可能是因为它不是一个完全不透明的位图?

OpenGL希望它的颜色是从0到1标准化的浮动,但我怀疑您的位图报告的颜色是从0到255

因此,我假设您正在将远大于1的RGB值传递给glColor,glColor被钳制为1,因此您的纹理看起来是相同的

试一试


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

尝试在除法之前将变量强制转换为浮点数

你是对的,用这种方法完成的,但它不是灰度的,而是暗红色的。你期望发生什么?从图像中删除的绿色和蓝色多于红色,因此它看起来是红色的。为什么要显示灰度@Franklioty那么我要做什么来淡化我的纹理呢@Tim您需要像以前一样使用加权平均值对所有三种颜色进行平均,然后将它们组合在一起得到一个灰色值,并将该值传递给所有三种颜色。例如:
float colorVal=((r*0.59f+g*0.3f+b*0.11f)/3.0f)
glColor4f(colorVal,colorVal,colorVal,alpha)