グレースケール画像 (多かれ少なかれ約 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
問題なく機能します。以前のバージョンでは、ImageData に固定長のバイト配列を使用しようとしましたが、クラッシュすることがありました。これは、画像サイズが固定されていないために発生したと思います。ここで、前に実際の配列の長さを計算できるときに、後で画像バイト配列を読み取ろうとします。関連するコードは次のとおりです。
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
.
誰にもアイデアがありますか?