如何在C#中将32bpp图像转换为16 bpp图像? (灰度)

时间:2017-01-09 15:26:15

标签: c#

我试图转换为灰度但不是16 bpp 如何使用下面的代码获得16 bpp灰度图像。

    for (int y = 0; y < tr.Height; y++)
        {
            for (int x = 0; x < tr.Width; x++)
            {
                //get pixel value
                p = tr.GetPixel(x, y);

                //extract pixel component ARGB
                int a = p.A;
                int r = p.R;
                int g = p.G;
                int b = p.B;

                //find average
                int avg = (r + g + b) / 3;

                //set new pixel value
                tr.SetPixel(x, y, Color.FromArgb(a, avg, avg, avg));
            }
        }

1 个答案:

答案 0 :(得分:0)

在这里,您只需更改颜色,而不是更改像素格式。您计算的平均值将介于0到255之间,然后将静态RGBA图像中的每个通道设置为该数字。要在计算的平均值中获得更高的分辨率,可以在求和之前将每个通道乘以256。然后,您计算的平均值将介于0到65535之间。但您希望保存这些值,而不是原始的Bitmap(仍然是RGBA格式),而是保存到Bitmap的{​​{1}} {1}}的{​​1}}。

......但是我应该警告你,这是徒劳的,因为在路上的某个地方(我忘记了确切地说),你会发现基本上没有办法将PixelFormat保存到真正的灰度格式。它总是出来RGB或索引。据我了解,这是GDI +的限制。有关更多信息,您可以指责Hans Passant可能会对您的问题发表评论。我会尝试找到一个问题链接来解释问题。

哦,我还要补充一点,R,G和B通道的平均值不是&#34;正确的&#34;将颜色转换为灰度的方法。有关详细信息,请参阅this question

我想我应该进一步注意,如果您在其他地方没有阅读,那么Format16bppGrayScaleBitmap速度很慢,而且设置了大量数据建议使用GetPixelSetPixel