Search code examples
c#imagegetpixel

improving speed of GetPixel function in c#


i need to read getpixel of bmp with speed but is very low i used of 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);
    }

and this function

        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;
    }

but output of my function is different from original getpixel


Solution

  • I have code in VB for some reason that does almost the exact same thing as you, so I hope this helps. You can try the following modification to GetMyPixel:

    Use Stride instead of Width and invert the byte order in your call to 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;
    }