MediaCapture SetEncodingPropertiesAsync返回异常提供的流编号无效。 PreviewState

时间:2015-12-06 18:40:20

标签: c# windows-phone win-universal-app windows-10-universal

我正在为我的Windows Phone(带有Windows 10的Lumia 950)开发通用Windows应用程序。这是一个非常简单的应用程序,使用手机的前置摄像头拍照。

问题在于拍摄的照片默认采用横向模式,这在拍照时效果不佳。我想将它旋转90度,使它成为一幅肖像。我使用MediaCapture对象初始化相机。我已尝试以下方法来旋转图像:

await _mediaCapture.InitializeAsync(settings);
var videoEncodingProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview);
videoEncodingProperties.Properties.Add(new Guid("C380465D-2271-428C-9B83-ECEA3B4A85C1"), 90);
await _mediaCapture.SetEncodingPropertiesAsync(MediaStreamType.VideoPreview, videoEncodingProperties, null);

但最后一行抛出异常“提供的流号无效。预览状态”。我猜这与提供的GUID有关,但经过无数小时的谷歌搜索,我一直在寻找开发人员用于此的价值。

我尝试了另一种旋转图像的解决方案:

_mediaCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees);

但这没有任何作用。

任何想法如何旋转图像?非常感谢!

2 个答案:

答案 0 :(得分:1)

要旋转预览,您需要有效预览。这意味着您需要将mediaCapture附加到捕获元素,然后启动预览,最后使用SetPreviewRotation设置旋转。 如果你这样做,它应该可以很好地工作。

答案 1 :(得分:0)

由于几乎没有什么对我有用,我最终重写了大部分应用程序以旋转图像。以下是我的代码最后工作的基本部分:

private async void TakePicture()
    {
        var stream = new InMemoryRandomAccessStream();

        try
        {
            await _mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), stream);
            var photoOrientation = _foundFrontCam ? PhotoOrientation.Rotate90 : PhotoOrientation.Normal;
            var photoFile = await KnownFolders.PicturesLibrary.CreateFileAsync("Photo.jpeg", CreationCollisionOption.GenerateUniqueName);
            await ReencodeAndSavePhotoAsync(stream, photoOrientation, photoFile);                
            var imageBytes = await ShowPhotoOnScreenThenDeleteAsync(photoFile);
            PostToServerAsync(imageBytes);
        }
        catch (Exception ex)
        {
            new MessageDialog(ex.Message).ShowAsync();
        }
    }

private async Task ReencodeAndSavePhotoAsync(IRandomAccessStream stream, PhotoOrientation photoOrientation, StorageFile photoFile)
    {
        using (var inputStream = stream)
        {
            var decoder = await BitmapDecoder.CreateAsync(inputStream);

            using (var outputStream = await photoFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                var encoder = await BitmapEncoder.CreateForTranscodingAsync(outputStream, decoder);
                var properties = new BitmapPropertySet { { "System.Photo.Orientation", new BitmapTypedValue(photoOrientation, PropertyType.UInt16) } };
                await encoder.BitmapProperties.SetPropertiesAsync(properties);
                await encoder.FlushAsync();
            }
        }
    }

创建PhotoOrientation对象并在保存图像时将其作为输入流的一部分传递就可以了。