0

在 Windows Phone 8 上,我希望以本机代码拍摄照片,但在最后阶段我被阻止无法从 IOutputStream 中提取信息。

在 C# 中,我们编写代码:

MemoryStream image = new MemoryStream();
MemoryStream imagePreview = new MemoryStream();
cameraCaptureSequence.Frames[0].CaptureStream = image.AsOutputStream();
cameraCaptureSequence.Frames[0].ThumbnailStream = imagePreview.AsOutputStream();
await cameraCaptureSequence.StartCaptureAsync();

从现在开始,图像流具有捕获图像的信息,我可以渲染它。

在 C++ / Cx 中,我需要做同样的事情,但更多的是要捕获捕获图像的字节*,这里是我的代码:

Windows::Phone::Media::Capture::CameraCaptureSequence^ cameraCaptureSequence;
IBuffer^ image;
return concurrency::create_async([this]()
{
    cameraCaptureSequence->Frames->GetAt(0)->CaptureStream = reinterpret_cast<IOutputStream^>(image);
    create_task( m_camera->PrepareCaptureSequenceAsync(cameraCaptureSequence) ).wait();
    create_task( cameraCaptureSequence->StartCaptureAsync() ).then([this]()
    {

    }
}

从最基本的事情开始,我希望了解如何将捕获的图像流的结果“保存”到 IBuffer^ 中,更好地获取内部字节 * 缓冲区。

谢谢

4

2 回答 2

1

您可以通过 ICameraCaptureFrameNative 访问本机代码中捕获的图像的像素数据。实现接口的对象是通过COM获得的。获得对象后,使用 MapBuffer() 访问 BYTE * 数组。

请注意,以这种方式获得的像素数据是NV12 格式,而不是预期的 JPEG 或 RGB。

   #include <Windows.Phone.Media.Capture.Native.h>

   CameraCaptureFrame^ frame = m_cameraCaptureSequence->Frames->GetAt(0);
   pNativeFrame = NULL;
   HRESULT hr = reinterpret_cast<IUnknown*>(frame)->QueryInterface(__uuidof(ICameraCaptureFrameNative ), (void**) &pNativeFrame);

   create_task( m_camera->PrepareCaptureSequenceAsync(m_cameraCaptureSequence) ).wait();
   create_task( m_cameraCaptureSequence->StartCaptureAsync() ).then([this]()
   {
         DWORD bufferSize =0;
         BYTE * pBuffer = NULL;
         pNativeFrame->MapBuffer(&bufferSize, &pBuffer); // Pixels are in pBuffer. 
         // Unmap() the buffer before capturing another image.
于 2013-10-23T07:36:24.853 回答
0

ICameraCaptureFrameNative 不能访问包含预览的纹理?

如果您想从 IBuffer 访问数据,请看这里:http: //msdn.microsoft.com/en-us/library/windows/apps/dn182761.aspx

对于您的情况,我认为您需要一个实现 IOutputStream 的类。也许InMemoryRandomAccessStream

于 2013-10-28T08:28:21.247 回答