我需要以速度读取bmp的getpixel,但是非常低 我用过LockBits
private void LockUnlockBitsExample(Bitmap bmp)
{
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
System.Drawing.Imaging.BitmapData bmpData =
bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
bmp.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
bmp.UnlockBits(bmpData);
}
和这个功能
private Color GetMyPixel(byte[] rgbValues,Bitmap bmp, int x,int y )
{
int index= (bmp.Width*y+x)*3;
Color MyColor = Color.FromArgb(rgbValues[index], rgbValues[index + 1], rgbValues[index + 2]);
return MyColor;
}
但我的函数输出与原始getpixel不同
答案 0 :(得分:2)
在这一行:
int index= (bmp.Width*y+x)*3;
我认为必须使用bmp.Stride
代替bmp.Width
。还要检查PixelFormat
是每像素24位的假设。
另一件事是颜色索引:蓝色是第一个(index
),然后是绿色(index+1
),然后是红色(index + 2
)。
答案 1 :(得分:1)
由于某种原因,我在VB中有代码与你几乎完全相同,所以我希望这会有所帮助。您可以尝试对GetMyPixel进行以下修改:
使用Stride代替Width并将调用中的字节顺序反转为FromArgb。
private Color GetMyPixel(byte[] rgbValues,Bitmap bmp, int x,int y )
{
int index= (bmp.Stride*y+x*3);
if (index > rgbValues.Length - 3)
index = rgbValues.Length - 3;
Color MyColor = Color.FromArgb(rgbValues[index+2], rgbValues[index + 1], rgbValues[index]);
return MyColor;
}
答案 2 :(得分:1)
您应该查看此帖子:working with lockbits
当我做类似的事情时,它给了我很多帮助