我试图转换为灰度但不是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));
}
}
答案 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。
我想我应该进一步注意,如果您在其他地方没有阅读,那么Format16bppGrayScale
和Bitmap
速度很慢,而且设置了大量数据建议使用GetPixel
和SetPixel
。