【问题标题】:Trying to understand how 1-bit BMP image is drawn试图了解如何绘制 1 位 BMP 图像
【发布时间】:2018-07-11 08:25:30
【问题描述】:

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

提前感谢您的回复。

【问题讨论】:

    标签: bmp


    【解决方案1】:

    有多种方法可以存储位图。在这种情况下,重要的区别是 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)),然后然后你一个接一个地读取像素。如果该位为零,则绘制黑色像素。如果是一个,画一个白色像素。完成:)

    【讨论】:

    【解决方案2】:

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

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

    对不起,我解释单色的方式实际上是灰度使用的,单色使用一个位来指示像素是黑色还是白色,取决于每个位的值,没有使用映射表。

    【讨论】:

    • 参考你的第一段:图像的属性说它的位深度是1位。如果“映射将作为每个像素一个字节”,我们的意思是什么?
    • 使用这个网站来帮助你理解Binary Image,这个另一个也可以帮助你理解其他类型,link,希望它能澄清事情!
    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多