【问题标题】:access unmanaged array inside delphi dll from c#从c#访问delphi dll中的非托管数组
【发布时间】:2012-11-16 15:27:07
【问题描述】:

我有一个 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 复制它们?

【问题讨论】:

    标签: c# multidimensional-array dllimport managed intptr


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的提示,它有效。可能是我在一天结束时太累了。对于第二部分,我试图访问字节的第三维,因为它代表 rgb 颜色 (byte[i][j][0] - r, byte[i][j][1] - g, [i ][j][2] - b)。所以,我必须将字节数组转换为 int(位图像素)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2017-04-24
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    相关资源
    最近更新 更多