提高c#中GetPixel函数的速度

时间:2012-09-20 10:26:36

标签: c# image getpixel

我需要以速度读取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不同

3 个答案:

答案 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

当我做类似的事情时,它给了我很多帮助