有多种方法可以存储位图。在这种情况下,重要的区别是 RGB 与索引。
在 RGB 位图中,每个像素都与三个单独的值相关联,一个代表红色,另一个代表绿色,另一个代表蓝色。根据“位数”(位深度)和特定的像素格式,不同的颜色通道可以为它们分配不同数量的位 - 最简单的情况是典型的真彩色,每个通道有 8 位,另一个8 位(可选)用于 Alpha 通道。但是,某些像素格式的分配方式略有不同 - 其想法是人眼对这些通道中的每一个都有不同的敏感度,您可以通过以更智能的方式分配位来节省空间并提高视觉质量。例如,较流行的像素格式之一是 BGR-565,即总共 16 位,蓝色 5 位,绿色 6 位,红色 5 位。
在索引位图中,与每个像素一起存储的值是调色板(颜色表)的索引(因此称为“索引位图”)。调色板通常是一个简单的颜色表,使用 RGB“像素”格式为每个索引分配一些特定的颜色。例如,索引 0 可能表示黑色,1 可能表示蓝绿色等。
在这种情况下,位深度并不能准确地映射到颜色质量 - 您不是在尝试映射整个颜色空间,而是在关注可能颜色的某个子集反而。例如,如果您有 256 种灰度(例如,从黑色到白色),则真彩色位图每个像素至少需要三个字节(并且这三个字节中的每一个都将具有相同的值),而您可以使用一个带有所有灰色调色板的索引位图,每个像素只需要一个字节(加上调色板的成本 - 256 * 3 字节)。使用索引位图有很多好处,还有很多技巧可以在不使用更多位/像素的情况下进一步提高视觉质量,但这超出了这个问题的范围。
这也意味着您只需要显示尽可能多的可能值。如果您只需要 16 种不同的颜色,则每个像素只需要 4 位。如果您只需要一个单色位图(即,一个像素“打开”或“关闭”),则每个像素只需要一个 bit - 这正是您的情况。如果您拥有所需的不同颜色数量,则可以通过取以 2 为底的对数(例如 log 256 = 8)轻松获得所需的位深度。
假设您有一张只使用两种颜色的图片 - 黑色和白色。您将构建一个具有黑色和白色两种颜色的调色板。对于位图中的每个像素,如果是黑色,则保存 0,如果是白色,则保存 1。
现在,当您想绘制这样的位图时,只需读取调色板(在本例中为 0 -> RGB(0, 0, 0), 1 -> RGB(1, 1, 1)),然后然后你一个接一个地读取像素。如果该位为零,则绘制黑色像素。如果是一个,画一个白色像素。完成:)