C++ 位图每像素位

Posted

技术标签:

【中文标题】C++ 位图每像素位【英文标题】:C++ Bitmap Bit per pixel 【发布时间】:2011-10-22 12:54:34 【问题描述】:

我正在尝试了解如何在 c++ 中基于原始数据构建 bmp,但我有几个问题。

我的 bmp 可以是黑白的,所以我认为在每像素位字段中我应该使用 1。但是在很多指南中,我看到填充字段添加了位数以保持 32 位对齐,这意味着我的 bmp 将与每像素 24 位 bmp 的文件大小相同。

这种理解是否正确,或者在某种程度上是每像素 1 位小于 24、32 等?

谢谢

【问题讨论】:

填充是每个扫描线,而不是每个像素。 【参考方案1】:

单色位图也可以对齐,但它们不会像 24/32-bpp 那样占用太多空间。

一行 5 像素宽的 24 位位图将占用 16 个字节:5*3=15 像素,1 字节填充。 一行 5 像素宽的 32 位位图将占用 20 个字节:5*4=20 像素,无需填充。 一行 5 像素宽的单色位图将占用 4 个字节:1 个字节用于像素(不能使用小于一个字节,因此占用整个字节,但不使用 8 位中的 3 个),以及3 个字节的填充。

因此,单色位图当然会小于 24 位。

【讨论】:

【参考方案2】:

上面已经给出了答案(位图行对齐/填充到 32 位边界),但是如果您想了解更多信息,您可能需要阅读 DIBs and Their Uses,“DIB 标头”部分 - 它在详细。

每条扫描线都是双字对齐的。扫描线被缓冲对齐;缓冲不一定是0。

扫描线倒置存储,内存中的第一次扫描(扫描 0)是图像中最底部的扫描。 (参见图 1。)这是 Presentation Manager 兼容性的另一个产物。 GDI 在 Set 和 Get 操作期间自动反转图像。图 1.(显示内存和屏幕表示的嵌入式图像。)

【讨论】:

以上是关于C++ 位图每像素位的主要内容,如果未能解决你的问题,请参考以下文章

我想了解位图、像素等相关基础知识

如何在 C++ 中绘制纹理/位图的区域?

如何将字节数组转换为位图实例 (.NET)?

如何使用 UIImage 加载 16 位图像?

C++:读取位图图像的问题

DC的兼容位图