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

标签 bmp

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

提前感谢您的回复。

最佳答案

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

在 RGB 位图中,每个像素都与三个单独的值相关联,一个用于红色,另一个用于绿色,另一个用于蓝色。根据“位数”(位深)和特定的像素格式,不同的颜色 channel 可以分配不同数量的位 - 最简单的情况是典型的真彩色,每个 channel 有 8 位,另一个8 位(可选)用于 alpha channel 。但是,某些像素格式的分配方式略有不同 - 其想法是人眼对每个 channel 的敏感度不同,您可以通过以更智能的方式分配位来节省空间并提高视觉质量。例如,一种更流行的像素格式是 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)),然后读取一个像素一个又一个。如果该位为零,则绘制一个黑色像素。如果是 1,则绘制一个白色像素。完毕 :)

关于bmp - 试图了解如何绘制 1 位 BMP 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14599208/

相关文章:

c - 在c中提取BMP图像的宽度

delphi - delphi TBitmap是否支持alpha channel

C - 更改 bmp 文件的像素颜色

arrays - 当像素阵列为小型可编辑文本 AS3 时,未生成 8 位 BMP 图像

c - 难以写入位图文件

c - Sprite 纹理中的透明度不起作用

jpeg - 需要有关 BMP 到 JPEG 转换的帮助

c - fopen 在尝试打开 bmp 文件(C++)时返回 NULL?

替换 bmp 中特定颜色的快速函数崩溃

Java:使用 FileOutputStream 保存大 .bmp 文件