从这个例子中可以看出,BMP 文件中的每个通道(R、G、B)都有一个输入。一个 24 位 BMP 图像有 8 位用于-R,8 位用于 G,8 位用于 B。我在 MS-paint 中将图像保存为单色(黑白)。它的属性表示图像的深度是 1 位。问题是谁得到了这 1 位:R、G 还是 B?这三个渠道都必须获得一定的价值不是强制性的吗?我无法理解 MS-Paint 如何使用 1 位绘制此 BMP 图像。
提前感谢您的回复。
有多种存储位图的方法。在这种情况下,重要的区别是 RGB 与索引。
在 RGB 位图中,每个像素都与三个单独的值相关联,一个代表红色,另一个代表绿色,另一个代表蓝色。根据“位数”(位深度)和特定的像素格式,不同的颜色通道可以为它们分配不同数量的位 - 最简单的情况是典型的真彩色,每个通道有 8 位,另一个8 位(可选)用于 Alpha 通道。但是,某些像素格式的分配方式略有不同 - 其想法是人眼对这些通道中的每一个具有不同的敏感度,您可以通过以更智能的方式分配位来节省空间并提高视觉质量。例如,较流行的像素格式之一是 BGR-565 - 即总共 16 位,蓝色 5 位,绿色 6 位和红色 5 位。
在索引位图中,与每个像素一起存储的值是调色板(颜色表)中的索引(因此称为“索引位图”)。调色板通常是一个简单的颜色表,使用 RGB“像素”格式为每个索引分配一些特定的颜色。例如,索引 0 可能表示黑色,1 可能表示绿松石等。
在这种情况下,位深度并不能准确地映射到颜色质量 - 您不是试图映射整个颜色空间,而是专注于可能颜色的某个子集。例如,如果您有 256 种灰度(例如,从黑色到白色),则真彩色位图每个像素至少需要三个字节(并且这三个字节中的每一个都将具有相同的值),而您可以使用一个带有所有灰色调色板的索引位图,每个像素只需要一个字节(加上调色板的成本 - 256 * 3 字节)。使用索引位图有很多好处,并且有很多技巧可以在不使用更多位/像素的情况下进一步提高视觉质量,但这超出了这个问题的范围。
这也意味着您只需要显示尽可能多的可能值。如果您只需要 16 种不同的颜色,则每个像素只需要 4 位。如果您只需要一个单色位图(即,一个像素“打开”或“关闭”),则每个像素只需要一个位- 这正是您的情况。如果您有所需的不同颜色数量,您可以通过取以 2 为底的对数(例如 log 256 = 8)轻松获得所需的位深度。
因此,假设您有一张只使用两种颜色的图像——黑色和白色。您将构建一个具有黑色和白色两种颜色的调色板。对于位图中的每个像素,如果是黑色,则保存 0,如果是白色,则保存 1。
现在,当您想绘制这样的位图时,您只需阅读调色板(在这种情况下为 0 -> RGB(0, 0, 0), 1 -> RGB(1, 1, 1)),然后阅读一个又一个像素。如果该位为零,则绘制黑色像素。如果是一个,画一个白色像素。完毕 :)
不,这取决于您选择另存为的数据类型。因为您选择保存为单色,所以此处不使用 RGB 映射,使用的映射将作为每个像素一个字节,范围从白色到黑色。
每种类型都有自己的映射方式,保存为24位会给你RGB映射,保存为256会为每个像素映射一个字节,每个值代表一个颜色(你可以在网上找到表格),至于单色,您将拥有与 256 位图相同的位图,但颜色表将只有白色和黑色。
抱歉打错了,我解释单色的方式实际上是灰度使用的,单色用一个位来表示像素是黑色还是白色,取决于每个位的值,没有使用映射表。