1

ここに私が持っているものがあります:

  • C で記述した外部 DLL。この DLL は opencv にリンクしています。OpenCV を C# から直接呼び出したくありません。DLL で使用される OpenCV にアクセスする大量の C コードが既に存在します。エクスポートされた関数があります: passbitmap(void *mem, size_t s);

  • DLL を呼び出したい AC# プロジェクト。

  • 何らかの方法でピクセル/ビットマップ データを DLL に渡したい System.Drawing.Bitmap オブジェクト。

ある種の P/Invoke だと思いますが、一度も行ったことがなく、この場合、適切に行う方法がわかりません。どのように進めればよいですか?

4

2 に答える 2

4

ビットマップへのネイティブ ハンドルを取得するには、Bitmap.GetHbitmap() を呼び出す必要があります。

次に、基本的にネイティブ相互運用を行い、GetDIBits()を呼び出します。ターゲット dll で実際に GetDIBits() を呼び出して、相互運用を行うよりも単に win32 ハンドルを渡す方がよい場合があります。

GetDC(NULL) から取得したデスクトップ DC で CreateCompatibleDC() を呼び出してから、作成したばかりの DC で CreateCompatibleBitmap() を呼び出す必要があります。次に GetDIBits() を呼び出します。

于 2009-03-19T04:13:04.893 に答える
1

C 関数のプロトタイプは、バッファーへのポインターとバッファーのサイズを必要とするだけであり、バッファー内で期待されるのは $64K の質問です。私の仮定/大雑把な推測では、それは ByteArray 形式のビットマップ ビットです。そう...

これは段階的に分解する必要があると思います...

[テストされていませんが、一般的な考え方は正しいと思います]

* ビットマップからおそらくバイト配列にデータを取得します *
データを格納するためにアンマネージ バッファを割り当てます
* バイト配列をバッファにコピーします。
* バッファー ポインターを C dll に渡します
* 完了したらバッファーを解放します

を使用してアンマネージ バッファを割り当てることができます

IntPtr pnt = Marshal.AllocHGlobal(size);

を使用してバイト配列をコピーできます

Marshal.Copy(theByteArray, 0, pnt, theByteArray.Length);

管理されていないデータであるため、完了したら解放する必要があります。

Marshal.FreeHGlobal(ptr)

@jeffamaphone が言うように、C コードにアクセスできる場合は、単にビットマップ ハンドルを渡す方がはるかに優れていることに注意してください。

于 2009-03-19T04:23:49.453 に答える