c++ 位图应该是2字节对齐还是4字节对齐?

svmlkihl  于 2022-12-01  发布在  其他
关注(0)|答案(3)|浏览(151)

MSDN文档似乎自相矛盾:
Here它说:
对于未压缩的RGB格式,最小跨距始终是以字节为单位的图像宽度,向上舍入到最接近的DWORD。
here则说:
每个扫描行中的字节数。该值必须能被2整除,因为系统假定位图的位值形成字对齐的数组。
因此,有时候MSDN需要4字节对齐的跨距,有时候它需要2字节对齐的跨距。哪一个是正确的?
更具体地说,当保存位图文件时,我应该使用4字节步幅还是2字节步幅?

pobjuy32

pobjuy321#

第一句话是准确的。第二句话可以追溯到16位版本的Windows,并且没有得到应有的编辑。并不完全不寻常,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个

nbnkbykc

nbnkbykc2#

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

位图不一定都是未压缩的RGB,它们可能是单色的。在BITMAP结构中,成员bmBitsPixel指定了每个像素的位数,因此它为1是有效的。因此,您应该以4的倍数的字节跨距保存RGB位图,并以2的倍数的字节跨距保存单色位图。

oyjwcjzk

oyjwcjzk3#

CreateBitmap/CreateBitmapIndirect/BITMAP struct -都是Windows 3.0之前的API,应该在16位处理器上使用。这就是为什么它们使用这个16位对齐步幅的原因。
所有较新的API都使用32位跨距对齐(sizeof(DWORD))。
如果您的缓冲区具有32位对齐步幅,则可以使用CreateDIBitmapCreateCompatibleBitmap/SetDiBits等“较新”的API(Windows 3.0之后)。
至于文件-它们使用BITMAPINFO/BITMAPINFOHEADER结构,并暗示32位步幅对齐。

相关问题