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

标签 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 似乎可以正确保存。

最佳答案

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

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

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

关于c# - 使用 FormatConvertedBitmap 将位图转换为 Gray8 仅使用 4 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8160495/

相关文章:

c# - 在列表中查找重复项

c# - C# 中的字典词典

C# 创建窗口——定义父窗口

android - 在 Android 中即时编辑位图

java - Android:如何在不将屏幕截图保存到 SD 卡的情况下在电子邮件中发送屏幕截图?

c# - .NET FtpWebRequest 是否同时支持隐式 (FTPS) 和显式 (FTPES)?

c# - 如何使文本框接受 double 值?

Android NDK 和动态壁纸渲染

c# - 如何使用 .NET 4.0 读取 .RTF 文件

c# - 访问窗口资源中的命名元素