本机代码中的 PhotoCaptureDevice
本文关键字:PhotoCaptureDevice 本机代码 | 更新日期: 2023-09-27 18:36:01
在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^中,更好地获取内部字节*缓冲区。
谢谢
您可以通过 ICameraCaptureFrameNative 访问 Native 代码中捕获的图像中的像素数据。实现接口的对象是通过 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.
ICameraCaptureFrameNative 无法访问包含预览的纹理?
如果你想从IBuffer访问数据,请看这里:http://msdn.microsoft.com/en-us/library/windows/apps/dn182761.aspx
对于您的情况,我认为您需要一个实现IOutputStream的类。也许InMemoryRandomAccessStream?