0

私は、カメラと契約を結び、この dll 内の 3d バイト配列にビデオ フレームを格納する delphi dll を持っています。rgb 形式を実装するには 3D ディメンションが必要であり、DLL のバックグラウンドに便利です (開発者が言ったように)。そのため、C# コードからその配列にアクセスし、ビットマップを作成してそのコンテンツを表示する必要があります。しかし、配列要素に適切にアクセスする方法がわかりません。これが私のコードです:

    private unsafe void ByteArray2Bitmap(IntPrt data, int width, int height, int depth, out Bitmap bmp)
    {            
        // create a bitmap and manipulate it
        bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
        BitmapData bits = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, bmp.PixelFormat);

        fixed(byte*** data = (byte***)(m_data.ToPointer()))
        {
            for (int i = 0; i < height; i++)
            {
                int* row = (int*)((byte*)bits.Scan0 + (i * bits.Stride));
                for (int j = 0; j < width; j++)
                {
                    int pixel = BitConverter.ToInt32(&data[i][j][0], 0);
                    row[j] = pixel;
                }
            }
        }
        bmp.UnlockBits(bits);
    }

そのコード行でエラーが発生しました: The right hand side of a fixed statement assignment may not be a cast expression

fixed(byte*** data = (byte***)(m_data.ToPointer()))

Marshal Copy でコピーせずに多次元の管理されていない配列にアクセスする方法はありますか?

4

1 に答える 1

0

あなたのコードはやや混乱しています。メソッドにパラメーターがあり、ステートメントで変数dataを作成しようとしています。おそらく、パラメーターは?datafixedm_data

いずれにせよ、m_data.ToPointer()すでに固定のアドレスが付与されているため、再度修正する必要はありません。あなたは書くことができるはずです:

byte*** data = (byte***)(m_data.ToPointer());

ここで何をしようとしているのか正確には不明です。pixelただし、その変数をbyteではなくにしたいことは確かですint。そうしないと、ビット データの末尾を書き込もうとすると、アクセス例外が発生します。

于 2012-11-16T17:49:39.627 に答える