【发布时间】:2021-07-21 13:13:15
【问题描述】:
我已经设法使用Bitmap.LockBits 从位图实例中提取像素信息。 PixelFormat 是 Format48bppRbg,根据我的理解和 Peter's answer 对上述问题的理解,应该使用两个字节存储每个像素的 RGB 颜色通道。字节的组合值应等于 0 到 8192 之间的数字,表示 RBG 通道强度值。该值是通过将两个字节都传递给BitConverter.ToUInt16 方法获得的。
因此,在为以下 3 x 3 位图提取像素信息时(为清晰起见,此处放大):
我的第一行像素通道是这样的:
| Pixel color | Red intensity | Green intensity | Blue intensity |
|---|---|---|---|
| RED | 8192 | 0 | 0 |
| GREEN | 0 | 8192 | 0 |
| BLUE | 0 | 0 | 8192 |
到目前为止一切顺利。
然而,在第二行,它是这样的:
| Pixel color | Red intensity | Green intensity | Blue intensity |
|---|---|---|---|
| WHITE | 8192 | 8192 | 8192 |
| GRAY (!) | 1768 (!) | 1768 (!) | 1768 (!) |
| BLACK | 0 | 0 | 0 |
白色和黑色像素通道值对我来说很有意义。
然而,灰色却没有。
如果你在上面的灰色像素上使用任何颜色选择器,你应该得到一个完美的中等灰色。在 24 位颜色中,它应该相当于 (R: 128, G: 128, B: 128),或十六进制形式的 #808080。
那么,为什么在Format48bppRpg 像素格式中,通道强度远低于预期的中间值 4096?这个基于 GDI+ 的 0-8192 范围不是应该像它的 8 位对应物一样工作吗,0 是最低强度,8192 是最高强度?我在这里错过了什么?
作为参考,这里是来自Visual Studio 调试器的屏幕截图,显示了原始字节索引和值,以及关于步幅、通道位置及其提取的强度值的附加说明,直到灰色像素:
【问题讨论】: