0

最近、低レベルのグラフィックス プログラミングの仕事 (ラスター グラフィックス アルゴリズムの実装) が必要になりました。unsafeそのため、低レベルの抽象化 (コードを使用しても) でプリミティブ (線、四角形、楕円など) を描画するのに役立つツール (クラス) を探し始めました。

アルゴリズムをWPFWindowsFormsWinAPIまたはその他の環境で実装する必要があるかどうかを検討します。とりあえずWPFを試してみます。ビットマップにピクセルを描画する方法の例をいくつか見つけましたが、残念ながらこのコードを理解するのに問題があります( MSDNのソースコード):

    // The DrawPixel method updates the WriteableBitmap by using 
    // unsafe code to write a pixel into the back buffer. 
    static void DrawPixel(MouseEventArgs e)
    {
        int column = (int)e.GetPosition(i).X;
        int row = (int)e.GetPosition(i).Y;

        // Reserve the back buffer for updates.
        writeableBitmap.Lock();

        unsafe
        {
            // Get a pointer to the back buffer. 
            int pBackBuffer = (int)writeableBitmap.BackBuffer;

            // Find the address of the pixel to draw.
            pBackBuffer += row * writeableBitmap.BackBufferStride;
            pBackBuffer += column * 4;//??

            // Compute the pixel's color. 
            int color_data = 255 << 16; // R
            color_data |= 128 << 8;   // G
            color_data |= 255 << 0;   // B 

            // Assign the color data to the pixel.
            *((int*)pBackBuffer) = color_data;//??
        }

        // Specify the area of the bitmap that changed.
        writeableBitmap.AddDirtyRect(new Int32Rect(column, row, 1, 1));

        // Release the back buffer and make it available for display.
        writeableBitmap.Unlock();
    }
  1. このpBackBuffer += column * 4;行は何のためですか?なぜ4ですか?
  2. それ*((int*)pBackBuffer) = color_data;はどういう意味ですか?私はC/C++からのポインターを知っていますが、C#には がIntPtrあります。int*この行は、int pBackBuffer = (int)writeableBitmap.BackBuffer;同等に扱うことができることを示唆してintおり、IntPtrこれも明確ではありません。
  3. どのプログラミング環境を使用すればよいですか? WinAPIWPFまたは他の?

誰かがこの安全でないコードを説明してくれたら、とてもありがたいです。

4

2 に答える 2

3

1:このpBackBuffer+=列*4とは何ですか。のためのライン?なぜ4?

ピクセルがARGBであると仮定すると、ピクセルあたり4バイトです。はX座標なのでcolumn、4を掛ける必要があります。

2:それは何ですか((int)pBackBuffer)= color_data; 平均?

(int*)pBackBuffer-の値をint pBackBufferintへのポインタとして扱います

*((int*)pBackBuffer) = color_datacolor_data-そのポインタに保存

IntPtrとintはまったく同じではありません。IntPtrは、32ビットOSで実行している場合は32ビットであり、64ビットOSで実行している場合は64ビットです。int常に32ビットです。

于 2012-10-06T22:12:25.700 に答える
0

前のコメントによると、コードを x64 と x86 の両方で機能させたい場合、IntPtr の代わりに int を使用して BackBuffer を指すのはエラーです。行は次のようになります...

IntPtr pBackBuffer = (IntPtr)writeableBitmap.BackBuffer;

BackBuffer は、x64 か x86 かに応じてサイズが変わるポインターであるためです。「int」は常に 32 ビットであるため、x64 でコンパイルするとオーバーフロー例外が発生する可能性があります。

于 2016-12-02T01:05:26.897 に答える