【问题标题】:desaturate an OpenGL texture去饱和 OpenGL 纹理
【发布时间】:2012-07-19 07:14:40
【问题描述】:

我有一个 透明度 的 .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 有问题。也许是因为它不是一个完全不透明的位图?

【问题讨论】:

    标签: c# opengl colors grayscale opentk


    【解决方案1】:

    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
    • 那么我必须做些什么来使我的纹理去色? @蒂姆
    • 您需要像您一样使用加权平均值对所有三种颜色进行平均,然后将它们组合在一起以获得单个灰度值,并将该值传递给所有三种颜色。例如:float colorVal = ((r * 0.59f + g * 0.3f + b * 0.11f) / 3.0f);glColor4f(colorVal, colorVal, colorVal, alpha);
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 1970-01-01
      • 2014-05-24
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多