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.WidthPixelFormatまた、 1 ピクセルあたり 24 ビットであるという仮定も確認してください。

もう 1 つはカラー インデックスです。最初は青 ( index)、次に緑 ( index+1)、次に赤 ( index + 2) です。

于 2012-09-20T10:37:03.563 に答える
1

この投稿を確認する必要があります:ロックビットの操作

私が似たようなことをしたとき、それは私を大いに助けました

于 2012-09-20T10:40:15.133 に答える
1

何らかの理由で、VB にあなたとほぼ同じことを行うコードがあるので、これが役立つことを願っています。GetMyPixel に対して次の変更を試すことができます。

Width の代わりに Stride を使用し、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;
} 
于 2012-09-20T10:38:05.090 に答える