0

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

4

3 回答 3

2

在这一行:

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

我相信bmp.Stride必须用 . 代替bmp.Width. PixelFormat还要检查每像素 24 位的假设。

另一件事是颜色索引:首先是蓝色 ( index),然后是绿色 ( index+1),然后是红色 ( index + 2)。

于 2012-09-20T10:37:03.563 回答
1

出于某种原因,我在 VB 中有代码与您几乎完全相同,所以我希望这会有所帮助。您可以尝试对 GetMyPixel 进行以下修改:

在对 FromArgb 的调用中使用 Stride 而不是 Width 并反转字节顺序。

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;
} 
于 2012-09-20T10:38:05.090 回答
1

您应该查看这篇文章:使用锁定位

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

于 2012-09-20T10:40:15.133 回答