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

时间:2013-01-30 08:05:43

标签: bmp

this example可以看出,BMP文件中的每个通道(R,G,B)都接受输入。 24位BMP图像具有8位for-R,8位用于G,8位用于B.我将MS-paint中的图像保存为单色(黑白)。它的属性表示图像的深度是1位。问题是谁得到这1位:R,G还是B?所有三个渠道都必须获得一定的价值并非强制性吗?我无法理解MS-Paint如何使用1位绘制此BMP图像。

提前感谢您的回复。

2 个答案:

答案 0 :(得分:2)

有多种方法可以存储位图。在这种情况下,重要的区别是RGB与索引。

在RGB位图中,每个像素都与三个独立的值相关联,一个用于红色,另一个用于绿色,另一个用于蓝色。取决于" bitness" (位深度)和特定的像素格式,不同的颜色通道可以为它们分配不同的位数 - 最简单的情况是典型的真彩色,每个通道有8位,另外8位(可选) alpha通道。然而,一些像素格式的分配方式略有不同 - 人们认为人眼对每个通道的灵敏度都不同,通过以更智能的方式分配比特,您可以节省空间并提高视觉质量。例如,一种比较流行的像素格式是BGR-565 - 即总共16位,蓝色为5位,绿色为6位,红色为5位。

在索引位图中,与每个像素一起存储的值是索引(因此"索引位图")到调色板(颜色表)中。调色板通常是一个简单的颜色表,使用RGB"像素"格式为每个索引分配一些特定的颜色。例如,索引0可能意味着黑色,1可能意味着turqouise等。

在这种情况下,位深度并不完全映射到颜色质量 - 您不会尝试映射整个颜色空间,您将重点放在相反,可能颜色的某些子集。例如,如果您有256个灰度(例如,从黑色到白色),真彩色位图每个像素至少需要三个字节(并且这三个字节中的每一个都具有相同的值),而您可以使用带有所有灰色颜色的托盘的索引位图,每个像素只需要一个字节(加上托盘的成本 - 256 * 3字节)。使用索引位图有很多好处,并且有很多技巧可以在不使用更多每像素位数的情况下进一步提高视觉质量,但这将超出这个问题的范围。

这也意味着您只需要显示尽可能多的可能值。如果您只需要16种不同的颜色,则每个像素只需要4位。如果你只需要一个单色位图(也就是说,一个像素是" on"或者它" off"),你只需要一个每个像素 - 这正是你的情况。如果你有所需的不同颜色,你可以通过取2对数(例如log 256 = 8)轻松获得所需的位深度。

所以,让我们说你的图像只使用两种颜色 - 黑色和白色。你将建造一个有黑色和白色两种颜色的托盘。对于位图中的每个像素,如果它是黑色则保存为0,如果它是白色,则保存为1.

现在,当您想要绘制这样的位图时,您只需读取调色板(在这种情况下,0 - > RGB(0,0,0),1 - > RGB(1,1,1)) ,然后你逐个读取一个像素。如果该位为零,则绘制一个黑色像素。如果是一个,则绘制一个白色像素。完成:))

答案 1 :(得分:1)

不,这取决于您选择保存的数据类型。因为您选择保存为单色,所以此处不使用RGB映射,并且使用的映射将作为每像素一个字节,从白色到黑色。

每种类型都有自己的映射方式,保存为24位将为您提供RGB映射,保存为256将为每个像素映射一个字节,每个值代表一种颜色(您可以在互联网上找到该表),如对于单色,你将与256位图相同,但颜色表只有白色和黑色。

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