将RGB图像升级为灰度8位和16位

时间:2015-10-07 09:00:04

标签: c# winforms

我有一个任务,我想将RGB图像转换为灰度8位和16位。我从谷歌得到了这个公式,但它不是8位还是16位。有人可以解释8位灰度和16位灰度之间的区别吗?

int i, j;
if (File != null)
{
    File2 = new Bitmap(File);
    for (i = 0; i <= File2.Width - 1; i++)
    {
        for (j = 0; j <= File2.Height - 1; j++)
        {
            Color originalColor = File2.GetPixel(i, j);
            int grayScale = (int)((originalColor.R * .3) + (originalColor.G * .59) + (originalColor.B * .11));
            Color newColor = Color.FromArgb(grayScale, grayScale, grayScale);
            File2.SetPixel(i, j, newColor);
        }
    }
    hasilBox.Width = File2.Width;
    hasilBox.Height = File2.Height;
    hasilBox.Image = File2;
}

1 个答案:

答案 0 :(得分:1)

这适用于8位,16位和24位图像。

8位图像的RGB值介于0到255之间。 16位图像的RGB值介于0和65535之间

假设你有一个8位白色值,RGB全部设置为255。

计算将导致255(全白),这是正确的。

类似地,将RGB全部设置为65535的16位白色的结果将导致65536(全白),这也是正确的。

这种缩放是有效的,因为0.3 + 0.59 + 0.11 = 1.0

对于非白色的值,缩放的工作方式类似。当然,黑色将始终将RGB全部归零,这将始终为0。

顺便提一下,这些数字的原因是它们接近人眼对这些颜色的反应。我们的眼睛对绿色更敏感,因此绿色成分对红色或蓝色的最终发光度的贡献更大。