我有一个delphi dll,它与相机有交易,并将视频帧存储到此dll内的3d字节数组中。实现rgb格式需要3d维度,这对于dll背景来说很方便(正如开发人员所说)。所以,我必须从c#代码访问该数组,构建一个Bitmap并显示其内容。但我不明白如何正确访问数组元素。 这是我的代码:
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复制它们?
答案 0 :(得分:0)
您的代码有些令人困惑。您的方法有data
参数,并且您尝试使用data
语句创建fixed
变量。也许参数应该是m_data
?
在任何情况下,m_data.ToPointer()
已经提供了固定地址,因此无需再次修复。你应该可以写:
byte*** data = (byte***)(m_data.ToPointer());
目前还不清楚你到底想要做什么。不过,我非常确定您希望pixel
变量为byte
而不是int
。否则,当您尝试注销位数据的末尾时,您将获得访问异常。