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

时间:2015-03-24 19:14:12

标签: c++ bitmap msdn bitmapfactory

MSDN文档似乎自相矛盾:

Here它说:

  

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

虽然here说:

  

每条扫描线中的字节数。该值必须可以被2整除,因为系统假定位图的位值形成一个字对齐的数组。

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

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

2 个答案:

答案 0 :(得分:4)

第一个引用是准确的。第二个可以追溯到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

答案 1 :(得分:1)

  

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

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