从Windows Phone 8.1 WinRT Camera预览中捕获WriteableBitmap

时间:2015-02-27 22:12:53

标签: c# camera windows-runtime windows-phone-8.1

我的问题是这个。如何从WP 8.1 WinRT中的相机预览图像中获取WriteableBitmap?

我以前在Silverlight中做过这个,但我似乎无法在WinRT中完成它...

我的目标是在相机预览图像中扫描条形码。我不想拍照并从那里扫描条形码。我想从相机预览中扫描条形码。

我像这样初始化我的相机:

// First get the rear camera
var _rearCamera = await GetCameraDeviceInfoAsync(Windows.Devices.Enumeration.Panel.Back);

_mediaCapture = new MediaCapture();
// Set up the initialization settings to use rear camera
await _mediaCapture.InitializeAsync(new MediaCaptureInitializationSettings
{
    StreamingCaptureMode = StreamingCaptureMode.Video,
    PhotoCaptureSource = PhotoCaptureSource.VideoPreview,
    AudioDeviceId = string.Empty,
    VideoDeviceId = _rearCamera.Id
});

然后我设置预览并开始在previewElement上显示它。

// Find the supported preview size that's closest to the desired size
var availableMediaStreamProperties =
    _mediaCapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.VideoPreview)
        .OfType<VideoEncodingProperties>()
        .Where(p => p != null && !String.IsNullOrEmpty(p.Subtype) && supportedVideoFormats.Contains(p.Subtype.ToLower()))
    .OrderByDescending(p => p.Width)
        .ToList();
_previewFormat = availableMediaStreamProperties.FirstOrDefault();

// Start Preview stream
await _mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.VideoPreview, _previewFormat);

_mediaCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees);
previewElement.Source = _mediaCapture;
await _mediaCapture.StartPreviewAsync();

但是现在我需要以某种方式在PreviewElement上获取相机图像的快照,这样我就可以将它发送到ZXing进行条形码解码。

我查看过无数个样本,但大多数是WP 8.0或WP 8.1 Silverlight ......

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

要截取直播,您需要在C ++中编写Media Foundation Transform(MFT),以media extension的形式插入渲染管道。

Media extensions sample演示了编写此类媒体扩展程序。另请参阅Walkthrough: Creating a Windows Store app using WRL and Media Foundation

一旦你拥有框架,你应该能够将它传递给zxing进行处理。

答案 1 :(得分:0)

在查看Lumia Imaging SDK之后......我找到了Real-time Filter Demo for Windows and Windows 8.1的示例,这正是我在非常简单的代码中所需要的。

为了控制相机并做一个焦点,例如我可以简单地说:

VideoDeviceController vdc = (VideoDeviceController)_cameraPreviewImageSource.VideoDeviceController;
await vdc.FocusControl.FocusAsync();