MSDN文档似乎自相矛盾:Here它说:对于未压缩的RGB格式,最小跨距始终是以字节为单位的图像宽度,向上舍入到最接近的DWORD。而here则说:每个扫描行中的字节数。该值必须能被2整除,因为系统假定位图的位值形成字对齐的数组。因此,有时候MSDN需要4字节对齐的跨距,有时候它需要2字节对齐的跨距。哪一个是正确的?更具体地说,当保存位图文件时,我应该使用4字节步幅还是2字节步幅?
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个
nbnkbykc2#
位图不一定都是未压缩的RGB,它们可能是单色的。在BITMAP结构中,成员bmBitsPixel指定了每个像素的位数,因此它为1是有效的。因此,您应该以4的倍数的字节跨距保存RGB位图,并以2的倍数的字节跨距保存单色位图。
BITMAP
bmBitsPixel
oyjwcjzk3#
CreateBitmap/CreateBitmapIndirect/BITMAP struct -都是Windows 3.0之前的API,应该在16位处理器上使用。这就是为什么它们使用这个16位对齐步幅的原因。所有较新的API都使用32位跨距对齐(sizeof(DWORD))。如果您的缓冲区具有32位对齐步幅,则可以使用CreateDIBitmap或CreateCompatibleBitmap/SetDiBits等“较新”的API(Windows 3.0之后)。至于文件-它们使用BITMAPINFO/BITMAPINFOHEADER结构,并暗示32位步幅对齐。
CreateBitmap
CreateBitmapIndirect
sizeof(DWORD)
CreateDIBitmap
CreateCompatibleBitmap
SetDiBits
BITMAPINFO
BITMAPINFOHEADER
3条答案
按热度按时间pobjuy321#
第一句话是准确的。第二句话可以追溯到16位版本的Windows,并且没有得到应有的编辑。并不完全不寻常,GDI32文档有相当多的错误。
请注意,向上投票的答案是不准确的。单色位图的步幅仍然是4的倍数,没有特殊的规则使其为2。下面是一些. NET代码来演示这一点:
输出:4个
nbnkbykc2#
位图不一定都是未压缩的RGB,它们可能是单色的。在
BITMAP
结构中,成员bmBitsPixel
指定了每个像素的位数,因此它为1是有效的。因此,您应该以4的倍数的字节跨距保存RGB位图,并以2的倍数的字节跨距保存单色位图。oyjwcjzk3#
CreateBitmap
/CreateBitmapIndirect
/BITMAP
struct -都是Windows 3.0之前的API,应该在16位处理器上使用。这就是为什么它们使用这个16位对齐步幅的原因。所有较新的API都使用32位跨距对齐(
sizeof(DWORD)
)。如果您的缓冲区具有32位对齐步幅,则可以使用
CreateDIBitmap
或CreateCompatibleBitmap
/SetDiBits
等“较新”的API(Windows 3.0之后)。至于文件-它们使用
BITMAPINFO
/BITMAPINFOHEADER
结构,并暗示32位步幅对齐。