Reputation: 2851
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
Upvotes: 0
Views: 1354
Reputation: 771
You should check this post out :working with lockbits
it helped me a lot when i did something similar
Upvotes: 1
Reputation: 1383
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;
}
Upvotes: 1
Reputation: 166
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
).
Upvotes: 2