我在C#中遇到一些基于像素的操作有问题。
我写了一个类作为Bitmap周围的图像shell。通过使用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生成的任何图像之外,这对我迄今为止使用过的所有图像都完美无缺。例如,我在油漆中制作了一个包含5种黄色的5x1图像。然而,当我将此图像加载到我的程序中时,图像步幅为16!我怀疑它是15(每像素3个字节,5个像素),但由于某种原因,在前三个字节(第一个像素)之后有一个额外的字节,然后其余的像素跟在数组中。
我只是为MSpaint保存的图像找到了这个,我希望有人能解释一下这个额外的字节是什么以及如何检测那个额外的字节。
答案 0 :(得分: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。