Как я могу передать .NET Bitmap в собственную DLL? - PullRequest
1 голос
/ 19 марта 2009

Вот что у меня есть:

  • Внешняя DLL, которую я написал на C. Эта DLL связана с opencv. Я не хочу вызывать OpenCV напрямую из C # - уже есть огромное количество кода C, обращающегося к OpenCV, которое будет использоваться в DLL. Существует экспортированная функция: passbitmap (void * mem, size_t s);

  • C # проект, из которого я хочу вызвать DLL.

  • Объект System.Drawing.Bitmap, из которого я хочу каким-то образом передать данные пикселей / растровых изображений в мою DLL.

Я предполагаю, что это своего рода P / Invoke, но я никогда не делал этого, и не знаю, как мне сделать это правильно в этом случае. Как мне поступить?

Ответы [ 2 ]

4 голосов
/ 19 марта 2009

Вам нужно вызвать Bitmap.GetHbitmap (), чтобы получить собственный дескриптор для растрового изображения.

Тогда вы, в основном, хотите сделать какое-то встроенное взаимодействие и вызвать GetDIBits () . Может быть лучше, чтобы ваша целевая dll фактически вызывала GetDIBits () и просто передавала дескриптор win32, а не выполняла взаимодействие.

Вам нужно будет вызвать CreateCompatibleDC () на рабочем столе DC, который вы получаете из GetDC (NULL), затем CreateCompatibleBitmap () на DC, который вы только что сделали. Затем вызовите GetDIBits ().

1 голос
/ 19 марта 2009

Прототип функции C просто хочет указатель на буфер и размер буфера, то, что он ожидает увидеть внутри буфера, - это вопрос в $ 64K. Мое предположение / дикое предположение заключается в том, что это битовые биты в форме ByteArray. Итак ...

Полагаю, это нужно разбить на шаги ...

[не проверено, но я думаю, что общая идея обоснована]

* получить данные из вашего растрового изображения, возможно, в байтовый массив
* выделить неуправляемый буфер для хранения данных
* скопировать байтовый массив в буфер.
* Передайте указатель буфера на ваш C dll
* Освободите буфер, когда вы закончите

Вы можете выделить неуправляемый буфер, используя

IntPtr pnt = Marshal.AllocHGlobal(size);

и вы можете скопировать ваш байтовый массив, используя

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

Обратите внимание, потому что это неуправляемые данные, вы будете нести ответственность за их освобождение, когда закончите.

Marshal.FreeHGlobal(ptr)

Обратите внимание, как говорит @jeffamaphone, если у вас есть доступ к коду c, было бы гораздо лучше просто передать дескриптор растрового изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...