为什么以这种方式计算位图大小?

时间:2014-07-18 23:52:57

标签: windows bitmap

我正在阅读与捕获图像相关的Window示例。该文章位于http://msdn.microsoft.com/en-us/library/dd183402(v=vs.85).aspx。我想到的一件事就是计算位图大小。就是这样:

 DWORD dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight;

我希望它更像是这样的东西:

 DWORD dwBmpSize = bmpScreen.bmWidth  * bmpScreen.bmHeight * bi.biBitCount / 8;

有人会介意解释前者的观点吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

位图由一系列水平扫描线表示。该表示的最小不可分割单位是32位字。这些字永远不会在扫描线之间共享,这意味着如果扫描线中的最后一个字没有被完全使用,那么就是这样(很可能是未使用位中的垃圾值)。下一条扫描线将以一个新的32位字开始。例如,如果您的位图只有1个像素宽,它仍将使用完整的32位字来表示每个位图线。

这就是为什么上述公式从计算表示位图的一条扫描线需要多少32位字开始的原因。这正是... + 31) / 32技巧的作用。通常,在无符号算术(A + B - 1) / B中,将A除以B进行四舍五入。因此,((bmpScreen.bmWidth * bi.biBitCount + 31) / 32部分告诉您需要多少32位字来表示位图的一行。然后将它乘以4,告诉您需要多少8位字节来表示位图的一行。

最后,将它乘以bmpScreen.bmHeight可得到整个位图的8位字节总数。