Skip to main content
 首页 » 编程设计

c#之使用 FormatConvertedBitmap 将位图转换为 Gray8 仅使用 4 位

2024年01月11日32jyk

我有一个 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 似乎可以正确保存。

请您参考如下方法:

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

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

您可以阅读图像的每个颜色值如何在灰度中加权,Here & Here .