3

我对 C# 中一些基于像素的操作有疑问。我编写了一个类,用作围绕Bitmap的图像外壳。Bitmap.GetRGB(x,y)通过使用BitmapDataLockBits直接访问图像数组并从那里读取字节,它可以比颜色对象更快地为您提供图像中某个 (x,y) 位置的像素的 RGB 值。0x00RRGGBB我添加了这个函数以在 (x,y) 像素的掩码中获取 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 生成的任何图像外,这对我迄今为止使用过的所有图像都完美无缺。例如,我用包含 5 种黄色阴影的颜料制作了一张 5x1 的图像。但是,当我将此图像加载到我的程序中时,图像步幅为 16!我怀疑它是 15(每个像素 3 个字节,5 个像素),但由于某种原因,在前三个字节(第一个像素)之后有一个额外的字节,然后其余的像素跟随在数组中。

我只为 MSpaint 保存的图像找到了这个,我希望有人能解释一下那个额外的字节是什么以及如何检测那个额外的字节。

4

1 回答 1

3

来自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.

因此,步幅始终是 4 的倍数,对于您的 3x5,将四舍五入为 16。

于 2013-03-08T18:16:20.313 回答