48 位位图中灰色像素的意外 RGB 通道值

问题描述

跟进this question

我已设法使用 Bitmap.LockBits 从位图实例中提取像素信息。 PixelFormatFormat48bppRbg,根据我对上述问题的理解和 Peter's answer,它应该使用两个字节来存储每个像素的 RGB 颜色通道。字节的组合值应等于 0 到 8192 之间的数字,代表 RBG 通道强度值。该值是通过将两个字节传递给 BitConverter.ToUInt16 方法获得的。

因此在提取以下 3 x 3 位图的像素信息时(为了清晰起见,此处放大了):

bitmap

我的第一行像素通道是这样的:

像素颜色 红色强度 绿色强度 蓝色强度
红色 8192 0 0
绿色 0 8192 0
蓝色 0 0 8192

到目前为止一切顺利。

然而,在第二行,它是这样的:

像素颜色 红色强度 绿色强度 蓝色强度
白色 8192 8192 8192
灰色 (!) 1768 (!) 1768 (!) 1768 (!)
黑色 0 0 0

白色和黑色像素通道值对我来说很有意义。

然而,灰色没有。

如果你在上面的灰色像素上使用任何颜色选择器,你应该得到一个完美的中等灰色。在 24 位颜色中,它应该等效于 (R: 128,G: 128,B: 128) 或十六进制形式的 #808080。

那么为什么在 Format48bppRpg 像素格式中,通道强度远低于预期的中间 4096 值?这个基于 GDI+ 的 0-8192 范围不应该像它的 8 位对应物一样工作,0 是最低强度,8192 是最高强度吗?我在这里错过了什么?

作为参考,这里是来自 Visual Studio 调试器的屏幕截图,显示了原始字节索引和值,以及关于步幅、通道位置和它们提取的强度值的附加说明,直到灰色像素:

screen capture

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)