windows - 为什么要这样计算位图大小?

标签 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;

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

谢谢!

最佳答案

位图由一系列水平扫描线表示。该表示的最小不可分割单元是 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/

相关文章:

java - 相机 Intent 结果问题

Android - 使用静态布局在位图底部绘制文本

Java 应用程序性能问题

sql-server - 为管理员用户启用的 xp_cmdshell 访问被拒绝

windows - UWP package.appmanifest Assets 生成器扩展了我的图像

python - 从 Python 下载/安装 Windows 更新

vb.net - 将位图对象传递给需要位图文件的文件名字符串的 Interop Word 函数

c - 显示 HBITMAP

wpf - 在WPF中使用位图

android - Bitmap.getPixel() 的替代方法