开始开发专门针对Windows的屏幕捕获软件。在MSDN上的Capturing an Image示例中,我发现自己有些困惑。

当我提到的位图大小不包括与实际文件相关的标题等时,请记住。我说的是原始像素数据。我以为该公式应该是(width*height)*bits-per-pixel。但是,根据示例,这是计算大小的正确方法:

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

或:((width*bits-per-pixel + 31) / 32) * 4 * height
我不明白为什么要进行额外的计算,包括31324。也许填充?我不确定,但任何解释将不胜感激。我已经尝试过谷歌搜索,但没有发现任何特别有用的结果。

最佳答案

代表位图像素的位打包成行。通过填充将每一行的大小四舍五入为4字节(32位DWORD)的倍数。

(bits_per_row + 31)/ 32 * 4确保向上舍入到32位的下一个倍数。答案是以字节为单位,而不是以位为单位,因此* 4而不是* 32。

另请:https://en.wikipedia.org/wiki/BMP_file_format

关于c++ - 如何计算位图大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48957742/

10-16 05:09