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

我正在阅读与捕获图像有关的窗口示例。 该文章位于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; 

谁会介意解释前者的观点?

谢谢!

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

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

最后,将它乘以bmpScreen.bmHeight将为您提供整个位图的8位字节总数。