我正在使用一个非托管库,它生成灰度图像(大约100x200像素左右)。一个图像包含在一个结构体中,在C语言中看起来像这样:
typedef struct abs_image {
ABS_DWORD Width;
ABS_DWORD Height;
ABS_DWORD ColorCount;
ABS_DWORD HorizontalDPI;
ABS_DWORD VerticalDPI;
ABS_BYTE ImageData[ABS_VARLEN];
} ABS_IMAGE
typedef unsigned int ABS_DWORD;
typedef unsigned char ABS_BYTE;
以下是我的C#包装结构:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct ABS_IMAGE {
public uint Width;
public uint Height;
public uint ColorCount;
public uint HorizontalDPI;
public uint VerticalDPI;
public IntPtr ImageData;
}
抓取图像和调用ABS_IMAGE
结构体没有问题。在之前的版本中,我尝试使用固定长度的字节数组,但有时会崩溃。我认为这是因为图像大小不是固定的。
现在我尝试在稍后读取图像字节数组,当我可以计算出真实的数组长度时。下面是相关的代码:
ABS_Type_Defs.ABS_IMAGE img =
(ABS_Type_Defs.ABS_IMAGE)Marshal.PtrToStructure(
pImage,
typeof(ABS_Type_Defs.ABS_IMAGE));
int length = ((int)img.Height - 1) * ((int)img.Width - 1);
byte[] data = new byte[length];
Marshal.Copy(img.ImageData, data, 0, length);
现在我的问题是:每次我想使用Marshal.Copy读取图像字节时,都会出现“AccessViolationException”的错误。有人有什么想法吗?