-1

さて、フォームにビットマップを表示するコードを書くのだろうか。
C# の配列のように直接アクセスすることは可能でしょうか?

ビットマップが既にメモリ内と画面上にあるため、これは疑問に思っています。
しかし、それを指す方法がわかりません。ポインターまたは配列のように、C#でこれを行いたいのですが、フォームの配列データ構造もわかりません(RGB BGR / RGB24などのように)

注意として、この画像ソースはファイルからのものではなく、Web カメラからのものです。
また、私がこれをやりたい理由は、getpixel / putpixel が私が望むものに対して遅いからです。

4

3 に答える 3

1

配列内の画像ピクセルを取得する場合は、次のように実行できます。

            Bitmap image = new Bitmap("somebitmap.png");
            Rectangle area = new Rectangle(0,0,image.Width, image.Height);
            BitmapData bitmapData = image.LockBits(area, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            int stride = bitmapData.Stride;
            IntPtr ptr = bitmapData.Scan0;
            int numBytes = bitmapData.Stride * image.Height;
            byte[] rgbValues = new byte[numBytes];
            Marshal.Copy(ptr, rgbValues, 0, numBytes);

それらを変更するときは、これを使用してその配列をビットマップにコピーする必要があります。

            Marshal.Copy(rgbValues, 0, bitmapData.Scan0, bitmapData.Stride * image.Height);
            image.UnlockBits(bitmapData);

しかし、あなたが言ったように本当にピクセルを処理したい場合は、FastBitmap実装を使用する必要があります。他にも多くの実装が利用可能です。

于 2012-10-25T22:52:47.633 に答える
0

C# で配列のようにビットマップにアクセスすることは、確かに可能です (簡単ですらあります)。Bitmap クラスを使用します。

Bitmap bmp = new Bitmap(640, 480);
Color pixel = bmp.GetPixel(x, y);    // "array like" access
bmp.SetPixel(x,y, Color.FromArgb(red,green,blue);

あなたの場合の秘訣は、ビットマップを Bitmap クラスに入れることです。すでにフォーム上にある場合は、「グラフィック コンテキスト」を作成して、そこから取得できます。

Graphics g = this.CreateGraphics();
Bitmap bmp = new Bitmap(640, 480, g);

またはコントロールから:

Graphics g = this.MyControl.CreateGraphics();
Bitmap bmp = new Bitmap(640, 480, g);

内部 RGB(A) フォーマットについて心配する必要はありません。「カラー」タイプを処理し、必要に応じて R/G/B コンポーネントを設定/取得するだけです。

于 2012-10-25T22:42:19.533 に答える
0

ビットマップ内のピクセルは、配列、つまり mybitmap[x,y] を介して公開されません。

GetPixel(x,y) メソッドを使用して特定のピクセルのカラー値にアクセスするか、SetPixel(x,y) メソッドを使用して値を変更できます。

于 2012-10-25T22:43:53.953 に答える