使用FormatConvertedBitmap将位图转换为Gray8仅使用4位?

时间:2011-11-17 00:05:46

标签: c# wpf bitmap

我有一个BitmapSource(RGB),我希望转换为8bpp灰度。这是我使用的代码:

BitmapSource ConvertToGray8(BitmapSource bitmap)
{
    FormatConvertedBitmap newFormattedBitmapSource = new FormatConvertedBitmap();

    newFormattedBitmapSource.BeginInit();
    newFormattedBitmapSource.Source = bitmap;
    newFormattedBitmapSource.DestinationFormat = PixelFormats.Gray8;
    newFormattedBitmapSource.EndInit();

    return newFormattedBitmapSource;
}

但是,如果我查看结果字节,我会得到这样的结果:

66 66 66 66 77 ff ff ee ff ff ff ff ff ff ff ff ff ee ff ff ff 00 00 00 11 00 00 00 ff
ff dd ff ff ff ff ff ff ff ff ff ff bb 88 88 88 88 ff ff ff ff 99 88 88 88 aa ff ff ff 
ff ff ff ff ff ff ff dd ff 88 00 ff ff 22 ff ff 00 88 ff dd ff ff ff ff ff ff ff ff ff 
ff ff ff ff ff ff ff ff dd ff ff cc 66 66 66 66 66 aa ff ff dd ff ff ff ff ff ff ff ff 
ff ff dd ff ff 33 00 11 11 11 00 22 ff ff dd ff ff ff ff ff ff ff ff ff ff ff 77 88

似乎只有4位用于转换(即0x0-0xF),然后重复它们以产生8位(即0x00-0xFF)。结果是一个具有16个灰度级的8位图像。

任何线索?如果可能的话,我想尽量避免手工转换。我很好奇为什么会像这样转换。

编辑:

我还使用了the project上显示的this article,结果相同。我开始认为没有真正的8bpp灰度(至少就BMP而言)并且它与索引有关。今天晚些时候会对此进行调查并更新是否有新内容。使用同一个项目,8bpp TIFF似乎可以正确保存。

1 个答案:

答案 0 :(得分:0)

值FF例如是4 + 4 = 8位。并不是只有四位用于转换,而是字节显示为十六进制数字,需要最少4位才能在一起。因此,数据中的每个字节都显示,因为两个HEX数字用空格分隔。

我猜,每个字节值对应256色标度的灰色变体。因此,当您的图像通过256色标度时,它可能会缩减为相应的16种灰度,而不是单独的8位灰度。

您可以阅读有关图像的每个颜色值如何以灰度,Here和& Here