c#中MSpaint图像的图像步幅是+1字节,为什么?

本文关键字:图像 字节 为什么 MSpaint | 更新日期: 2023-09-27 18:03:06

我有一个关于c#中一些基于像素的操作的问题。我写了一个类,它可以作为位图周围的图像外壳。它可以通过使用BitmapData和LockBits直接访问图像数组并从那里读取字节,从而比Bitmap.GetRGB(x,y)颜色对象更快地为您提供图像中某个(x,y)位置的像素的RGB值。我添加了这个函数来获得(x,y)像素的0x00RRGGBB蒙版中的RGB。

public unsafe int getPixel(int x, int y)
    {
        byte* imgPointer = (byte*)bmpData.Scan0;
        int pixelPos = 0;
        if (y > 0) pixelPos += (y * bmpData.Stride);
        pixelPos += x * (hasAlpha ? 4 : 3);            
        int blue = *(imgPointer + pixelPos);
        int green = *(imgPointer + pixelPos + 1);
        int red = *(imgPointer + pixelPos + 2);
        int rgb = red << 16;
        rgb += green << 8;
        rgb += blue;
        return rgb;
    }

这对于我迄今为止使用过的所有图像都可以完美地工作,除了我使用MSPaint生成的任何图像。例如,我用油漆制作了一张5x1的图像,其中包含5种黄色。然而,当我将这个图像加载到我的程序中时,图像步幅是16!我怀疑它是15(每个像素3字节,5像素),但由于某种原因,在前三个字节(第一个像素)之后有一个额外的字节,然后其余的像素跟随在数组中。

我只发现这是由MSpaint保存的图像,我希望有人能解释我额外的字节是什么,以及如何检测额外的字节。

c#中MSpaint图像的图像步幅是+1字节,为什么?

From MSDN:

The stride is the width of a single row of pixels (a scan line), rounded up to a four-byte boundary. If the stride is positive, the bitmap is top-down. If the stride is negative, the bitmap is bottom-up.

所以stride总是4的倍数,对于3x5,将四舍五入到16