位图是否应该按2字节或4字节对齐?

3

MSDN的文档似乎自相矛盾:

这里说:

对于未压缩的RGB格式,最小步幅始终是图像宽度(以字节为单位),向上舍入到最近的DWORD。

然而这里说:

每个扫描行中的字节数。此值必须是2的倍数,因为系统假定位图的位值形成一个按字对齐的数组。

因此有时候MSDN需要4字节对齐的步幅,有时候需要2字节对齐的步幅。哪一个是正确的呢?

更具体地说,在保存位图文件时,我应该使用4字节步幅还是2字节步幅?


从您提供的第一个链接中可以看出,“对于YUV格式,没有通用规则来计算最小步幅”,因此可能至少有一种YUV格式具有两个字节步幅对齐。 - Mark B
从您提供的第二个链接可以清楚地看出,该页面主要描述的是单色位图。这肯定是一个相当古老的页面了。 - Jongware
3个回答

6

第一个引用是准确的,第二个引用可以追溯到Windows 16位版本,并且没有进行应有的编辑。这种情况并不罕见,GDI32文档中存在相当多的错误。

请注意,得到赞同的答案是不准确的。单色位图仍然具有4的倍数的步幅,没有特殊的规则使其为2。以下是一些.NET代码来展示这一点:

var bmp = new Bitmap(1, 1, System.Drawing.Imaging.PixelFormat.Format1bppIndexed);
var bdata = bmp.LockBits(new Rectangle(0, 0, 1, 1), System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);
Console.WriteLine(bdata.Stride);

输出结果:4


0
对于未压缩的 RGB 格式,最小步幅始终是图像宽度(以字节为单位),向最近的 DWORD 上取整。
位图不一定总是未压缩的 RGB,它们可能是单色的。在 BITMAP 结构中,成员 bmBitsPixel 指定每个像素的位数,因此其值为 1 是有效的。因此,应将 RGB 位图保存为字节步幅的倍数,并将单色位图保存为步幅的倍数为 2。

0

CreateBitmap/CreateBitmapIndirect/BITMAP结构体 - 都是预Windows 3.0时代的API,应该在16位处理器上使用。这就是为什么它们使用这个16位对齐的步幅。

所有新的API都使用32位步幅对齐(sizeof(DWORD))。

如果您的缓冲区具有32位对齐的步幅,则可以使用“更新”的API(Windows 3.0之后)如CreateDIBitmapCreateCompatibleBitmap/SetDiBits

至于文件 - 它们使用BITMAPINFO/BITMAPINFOHEADER结构和意味着32位步幅对齐


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接