Как я могу передать растровое изображение .NET в собственную DLL?

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

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

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

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

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


person George    schedule 19.03.2009    source источник


Ответы (2)



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

Я думаю, это нужно разбить на этапы...

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

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

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

IntPtr pnt = Marshal.AllocHGlobal(size);

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

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

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

Marshal.FreeHGlobal(ptr)

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

person Tim Jarvis    schedule 19.03.2009