我正在阅读与捕获图像相关的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;
有人会介意解释前者的观点吗?
谢谢!
答案 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位字节总数。