0

我有一个 delphi dll,它处理相机并将视频帧存储到这个 dll 中的 3d 字节数组。实现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);
    }

那行代码出错:固定语句赋值的右侧可能不是强制转换表达式

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

是否有任何方法可以访问多维非托管数组而不使用 Marshal Copy 复制它们?

4

1 回答 1

0

您的代码有些混乱。您有data该方法的参数,并且您正在尝试使用该语句创建一个data变量。fixed也许参数应该是m_data

无论如何,m_data.ToPointer()已经给出了一个固定的地址,所以没有必要再次修复它。你应该能够写:

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

目前尚不清楚您要在这里做什么。不过,我相当肯定,您希望该pixel变量是 abyte而不是int. 否则,当您尝试注销位数据的末尾时,您将获得访问异常。

于 2012-11-16T17:49:39.627 回答