2015-01-09 2 views
1

Я использую mediaCapture с AddEffectsAsync, чтобы установить MFT на камеру. Используя этот MFT, я смог вернуть данные для каждого кадра из MFT. Теперь растровое изображение выглядит как класс Nokia :: Ghraphics :: Imaging :: Bitmap. В следующем коде, я беру размер буфера и буфера от него и отправить его в моем приложении:C++/CX Как создать BitmapImage из буфера и количества буфера

void TransformImage_NV12(
const D2D_RECT_U &rcDest, 
_Inout_updates_(_Inexpressible_(2 * lDestStride * dwHeightInPixels)) BYTE *pDest, 
_In_ LONG lDestStride, 
_In_reads_(_Inexpressible_(2 * lSrcStride * dwHeightInPixels)) const BYTE *pSrc, 
_In_ LONG lSrcStride, 
_In_ DWORD dwWidthInPixels, 
_In_ DWORD dwHeightInPixels, 
IVector<IImageProvider^>^ providers) 
{ 

    auto size = Windows::Foundation::Size(dwWidthInPixels, dwHeightInPixels); 
    auto totalbytes = (int)dwHeightInPixels * (int)dwWidthInPixels * 3/2; 

    Nokia::Graphics::Imaging::Bitmap^ m_BitmapToProcess = AsBitmapNV12(pSrc, (unsigned int)size.Width, (unsigned int)size.Height); 

    BitmapImageSource^ source = ref new BitmapImageSource(m_BitmapToProcess); 
    auto first = providers->GetAt(0); 
    ((IImageConsumer^)first)->Source = source; 

    auto last = providers->GetAt(providers->Size - 1); 

    BitmapRenderer^ renderer = ref new BitmapRenderer(last, ColorMode::Yuv420Sp); 

    auto renderOp = renderer->RenderAsync(); 
    auto renderTask = create_task(renderOp); 

    renderTask.then([pDest, totalbytes](Nokia::Graphics::Imaging::Bitmap^ bitmap) 
    { 
     auto count = bitmap->Buffers->Length; 
     unsigned char* data = FromIBuffer(bitmap->Buffers[0]->Buffer); 
     CMFTWrapper::FrameData = data; 
     CMFTWrapper::count = count; 
     SetEvent(CMFTWrapper::FrameEvent()); 
     CopyMemory(pDest, data, totalbytes); 
    }).wait(); 
} 

Doing это у меня есть обратный вызов вызывается в моем приложении:

void VideoCapturerSampleCallback(struct LmiVideoCapturer_* capturer, const LmiVideoFrame* videoFrame, LmiVoidPtr userData) 
{ 
    App2::MainPage^ ctx = context; 
    Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([ctx]() 
    {   
     Windows::UI::Xaml::Media::Imaging::BitmapImage^ bitmapImage = 
     ref new Windows::UI::Xaml::Media::Imaging::BitmapImage(); 
     //TODO will need to create it from the buffer 
     media->Source = bitmapImage; 
})); 
} 

Здесь у меня есть доступ к буферу и счету из MFT, используя класс CMFTWrapper, в котором я сохранил данные. Мой вопрос в том, как я могу загрузить эти данные внутри моего bitmapImage, который я создал? Я нашел несколько кодов, показывающих мне, как построить aa bitmapImage, но большинство из них находятся на C#, и мне нужно использовать C++/cx

ответ

1

Вы хотите использовать Windows.UI.Xaml.Media.Imaging.WriteableBitmap.

С WriteableBitmap, вам нужно использовать IBufferByteAccess (включая robuffer.h, чтобы получить это определение):

using namespace Microsoft::WRL; 
auto xaml_image = ref new WriteableBitmap(width, height); 

// Cast PixelBuffer to Object^, then to its underlying IInspectable interface. 
Object^ obj = xaml_image->PixelBuffer; 
ComPtr<IInspectable> insp(reinterpret_cast<IInspectable*>(obj)); 

// Query the IBufferByteAccess interface. 
ComPtr<IBufferByteAccess> bufferByteAccess; 
ThrowIfFailed(insp.As(&bufferByteAccess)); 

// Get native pointer to the buffer data. 
byte* pixels = nullptr; 
ThrowIfFailed(bufferByteAccess->Buffer(&pixels)); 

// TODO: copy image data in BGRA8 format into 'pixels' buffer 
// memcpy_s(pixels, xaml_image->PixelBuffer->Capacity, data, width*height*4); 

// Set final source 
media->Source = xaml_image; 
0

ред ответ, потому что я, видимо, не читал этот вопрос правильно.

Вы видели CameraPreviewImageSource btw? Он использует MF под капотом, позволяя вам обрабатывать поток предварительного просмотра камеры.

Btw, теперь есть версия 2.0 того, что переименовано в Lumia Imaging SDK. Обновите пакет nuget, чтобы получить его.

+0

Кстати, может быть образец, опубликованный в какой-то момент о том, как сделать MFT, который использует конвейер SDK Imaging. Это будет интересно? –

Смежные вопросы