1

我正在为我的 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);

但最后一行抛出异常“提供的流号无效。PreviewState”。我猜这与提供的 GUID 有关,但经过无数小时的谷歌搜索后,我不断发现开发人员为此使用的这个值。

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

_mediaCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees);

但这无济于事。

有什么想法可以旋转图像吗?非常感谢!

4

2 回答 2

1

要旋转预览,您需要一个活动预览。这意味着您需要将 mediaCapture 附加到您的捕获元素,然后开始预览,最后使用 SetPreviewRotation 设置旋转。如果你这样做,它应该可以完美地工作。

于 2016-05-11T12:08:12.910 回答
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 对象并在保存图像时将其作为输入流的一部分传递就可以了。

于 2015-12-06T21:02:20.797 回答