尝试了解如何绘制 1 位 BMP 图像



这个例子中可以看出,BMP文件中的每个通道(R,G,B)都接受一个输入。24 位 BMP 图像具有 8 位 for-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 位图一样,但颜色表只会有白色和黑色。

抱歉弄错了,我解释单色的方式实际上是灰度使用的,单色使用一个位来指示像素是黑色还是白色,具体取决于每个位的值,不使用映射表。

最新更新