我正在阅读与捕获图像相关的 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;
有人介意解释一下前者的观点吗?
谢谢!
最佳答案
位图由一系列水平扫描线表示。该表示的最小不可分割单元是 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 位字节总数。
关于windows - 为什么要这样计算位图大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24835333/