使用Windows Phone 8.1在C ++ / CX中拍照

时间:2015-08-08 15:56:02

标签: windows-phone-8.1 c++-cx

我在Windows Phone 8.1系统的应用程序上使用C ++ / CX(在Visual Studio 2013中)。我在诺基亚Lumia 930上测试我的应用程序。我的应用程序必须拍照才能对它们进行一些图像处理。因此,我希望byte*char*unsigned char*能够满足我的需求。因此,我尝试使用::Windows::Media::Capture::MediaCapture::CapturePhotoToStreamAsync将照片的内容转换为流,然后使用::Windows::Storage::Streams::DataReader获取照片的实际字节数。但我没有成功。更确切地说,问题出现在下面的代码中。

IRandomAccessStream ^ras = ref new InMemoryRandomAccessStream();
IAsyncAction ^ac = cap->CapturePhotoToStreamAsync(ImageEncodingProperties::CreateBmp(),ras);
ac->Completed = ref new AsyncActionCompletedHandler(
[=] (IAsyncAction ^async_op,AsyncStatus status) mutable
{
    debug->Text = L"finished";
});

其中cap是指向MediaCapture的托管指针,似乎已正确初始化。

但是debug TextBlock从不显示finished。当我获得ac状态时,它似乎永远会被Started阻止,它永远不会到达ErrorCompleted。我不懂为什么。所以现在我实现了一个使用::Windows::Media::Capture::MediaCapture::CapturePhotoToStorageFileAsync的脏变通方法。但是将照片存储在文件上的位图然后将其读回以将图像恢复到内存中并不令人满意。

我在使用Windows Phone 8.1拍摄照片时发现了很多,但是它们都在C#中,并且通过'.'取代'::'无法复制粘贴这些解决方案。我的意思是(至少对我而言)将C#代码改编为C ++代码并不容易。

所以我的问题是:

  1. 是否有快速和/或干净的方法来获得一个好的旧C指针指向图像的像素?

  2. 为什么CapturePhotoToStreamAsync阻止状态为Started

  3. 感谢您的回答和时间。

1 个答案:

答案 0 :(得分:0)

查看Microsoft Github页面上的基本相机示例应用程序:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraStarterKit

在你拍照(初始化,配置,开始预览等)之前你需要做很多事情,样本会引导你完成它。

这是我上面链接的示例中缩短的片段:

/// <summary>
/// Takes a photo to a StorageFile and adds rotation metadata to it
/// </summary>
/// <returns></returns>
task<void> MainPage::TakePhotoAsync()
{   
    auto inputStream = ref new Streams::InMemoryRandomAccessStream();

    // Take the picture
    WriteLine("Taking photo...");
    return create_task(_mediaCapture->CapturePhotoToStreamAsync(Windows::Media::MediaProperties::ImageEncodingProperties::CreateJpeg(), inputStream))
        .then([this, inputStream]()
    {
        WriteLine("Photo taken!");

        auto photoOrientation = ConvertOrientationToPhotoOrientation(GetCameraOrientation());
        return ReencodeAndSavePhotoAsync(inputStream, photoOrientation);
    }).then([this](task<void> previousTask)
    {
        try
        {
            previousTask.get();
        }
        catch (Exception^ ex)
        {
            WriteException(ex);
        }
    });
}