在C#和Windows窗体中将照片转换为灰度

本文关键字:照片 转换 灰度 Windows 窗体 | 更新日期: 2023-09-27 18:21:06

如何将其转换为灰度?

在谷歌上搜索了很多之后,我能做的最好的事情就是改变图片的色调(在下面的代码中,它是绿色的)。我该怎么做?

byte[] redGreenBlueVal = new byte[numBytes];
for (int i = 0; i < redGreenBlueVal .Length; i += 4)
{
    redGreenBlueVal [i + 0] = (byte)(.114 * redGreenBlueVal [i + 0]); --> blue
    redGreenBlueVal [i + 1] = (byte)(.587 * redGreenBlueVal [i + 1]); --> green
    redGreenBlueVal [i + 2] = (byte)(.299 * redGreenBlueVal [i + 2]); --> red
}

在C#和Windows窗体中将照片转换为灰度

实际上,您正在调整HSB,这样可以获得更好的灰度图像:30%红色59%绿色11%蓝色

byte[] redGreenBlueVal = new byte[numBytes];
for (int i = 0; i < redGreenBlueVal .Length; i += 4)
{
      gray = (byte)(.11 * redGreenBlueVal [i + 0]);
      gray += (byte)(.59 * redGreenBlueVal [i + 1]); 
      gray += (byte)(.3 * redGreenBlueVal [i + 2]);
      redGreenBlueVal [i + 0] = gray;
      redGreenBlueVal [i + 1] = gray;
      redGreenBlueVal [i + 2] = gray;
}

您可以尝试将每个像素的颜色通道设置为该像素的平均值。

for( int i = 0; i < redGreenBlueVal.Length; += 4 )
{
    int average = (redGreenBlueVal[i + 0] + redGreenBlueVal[i + 1] + redGreenBlueVal[i + 2])/3;
    redGreenBlueVal[i + 0] = average;
    redGreenBlueVal[i + 1] = average;
    redGreenBlueVal[i + 2] = average;
}

要获得灰度图像,基本思想是让所有3个通道都保持相同的值。有很多方法可以做到这一点,最简单的是:

  • 只使用其中一个频道(当你在photoshop中选择单个频道时,会看起来像这样)
  • 计算3个通道的平均值