我有一个任务,我想将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;
}
答案 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。
顺便提一下,这些数字的原因是它们接近人眼对这些颜色的反应。我们的眼睛对绿色更敏感,因此绿色成分对红色或蓝色的最终发光度的贡献更大。