Для некоторого контекста у нас есть решение Visual Studio с тремя проектами. Основной проект — это приложение C#, у нас есть библиотека C++, которая по сути является конвейером рендеринга изображений, и у нас есть компонент WinRT c++/cx в качестве связующего звена между ними.
Мы переносим некоторые из наших цепочек фильтров изображений (в библиотеке C++) в Lumia Imaging SDK в проекте c++/cx WinRT. Поскольку мы работаем с байтовыми буферами, мы не знали, как указать Lumia::Imaging::Bitmap^ на наши буферы, не копируя их. (Мы не можем вызвать AsBuffer() для uchar* (т. е. нашего массива байтов), потому что этот метод расширения недоступен для нас в стране C++.)
Итак, вопрос заключается в следующем: имея входной uchar* для некоторого метода, который будет реализовывать цепочку фильтров Lumia, как мы создадим Bitmap (или BitmapImageSource), который не приведет к копированию буфера?
Вот пример кода, который нам нужно заполнить пробелами:
Bitmap^ MyClass::GetBitmapImageDestination(uchar *imageBytes, int imageWidth, int imageHeight, ColorMode colorMode) {
int channels = colorMode == ColorMode::Gray8 ? 1 : 4;
IBuffer^ byteBuffer = ..... ????
return ref new Bitmap(Windows::Foundation::Size((float)imageWidth, (float)imageHeight), colorMode, (uint)(imageWidth * channels), byteBuffer);
}