Question

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

Was it helpful?

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

OTHER TIPS

In this line:

int index= (bmp.Width*y+x)*3;

I believe that bmp.Stride must be used instead of bmp.Width. Also check assumption that PixelFormat is 24 bits per pixel.

Another thing are color indexes: blue is first (index), then green (index+1), then red (index + 2).

You should check this post out :working with lockbits

it helped me a lot when i did something similar

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top