c++ - 位图行大小计算

标签 c++ winapi video bitmap avi

我找到了 this source效果很好,我只想问一下我没有得到的这段代码:

//calculate total size of RGBQUAD scanlines (DWORD aligned)

    bih.biSizeImage = (((bih.biWidth * 3) + 3) & 0xFFFC) * bih.biHeight ;

我明白为什么有“*3”,但没有得到“+3”和 FFFC hexa 的按位与。有人能解释一下为什么他会这样计算图像的大小吗?

谢谢

最佳答案

如果您对各种值进行尝试,您会发现它实际上是在强制 (width * 3) 向上舍入到包含它的 4 的最小倍数。他这样做可能是为了强制执行 32 位对齐。

使用 python :

>>> f = lambda x: ((x * 3) + 3) & 0xFFFC
>>> [f(x) for x in range(1, 20)]
[4, 8, 12, 12, 16, 20, 24, 24, 28, 32, 36, 36, 40, 44, 48, 48, 52, 56, 60]

下面显示了只进行直接乘法和向上取整为 4 的倍数之间的区别

>>> [(3*x, f(x)) for x in range(1, 8)]
[(3, 4), (6, 8), (9, 12), (12, 12), (15, 16), (18, 20), (21, 24)]

令我惊讶的是代码实际上并没有记录这个事实。一点点摆弄是一件美妙的事情,但它看起来很随意。

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

相关文章:

c++ - 转义序列?在 Qstring 中使用引号

c++ - CRITICAL_SECTION 用于设置和获取单个 bool 值

windows - 文件的内存映射与 CreateFile/ReadFile

video - 如何用 HTML5 <video> 播放 MPEG4 Visual?

video - 使用 ffmpeg 自动将视频分割成四分之一和堆叠

c++ - 重载赋值运算符不适用于链接

c++ - 存储 std::assume_aligned 指针 C++ 20

c++ - 如何在运行时/动态地在 C++ 中获取类的所有属性/变量

c - 如何向菜单项添加工具提示

video - 使用 FFmpeg 仅在单个帧上绘制文本、绘图框或覆盖