Как получить DIB, реализованный в библиотеке C++/COM, в клиент.NET, используя этот объект COM
У нас есть COM-объект, реализованный на C++/ATL, который включает метод, который будет возвращать DIB. Мы также пишем приложение.NET, которое будет использовать этот COM-объект. Так как мы пишем оба, мы можем решить, как лучше всего вернуть этот DIB из COM-объекта. Чтобы уточнить, лучше ли будет возвращать собственный дескриптор Windows в DIB или байтовый массив, или есть какой-то другой способ легко преобразовать DIB Windows в объект.NET Image? И, в связи с этим вопросом: как только я вернул DIB, как я могу получить его в объект.NET Image?
2 ответа
COM/OLE имеет стандартный интерфейс для представления графических изображений, называемый IPicture (и его версия IPictureDisp, дружественная к сценариям).
COM обеспечивает реализацию этих интерфейсов для вас. Вы можете получить его, чтобы создать его для вас, вызвав OleCreatePictureIndirect (). Вы просто передаете ему структуру PICTDESC с имеющейся у вас графикой, и она возвращает вам интерфейс. Вы должны быть в состоянии передать этот интерфейс обратно вызывающей программе. Это также сделает ваш объект совместимым с другими COM-клиентами, такими как VB6.
Вернувшись в.NET land, вы можете превратить IPicture в изображение с помощью Microsoft.VisualBasic.Compatibility.VB6.IPictureToImage ().
Взгляните на статью DIB для System.Bitmap на CodeProject. Он имеет код для преобразования из DIB в растровое изображение. Идея состоит в том, что DIB представляется с использованием IntPtr.