我正在为我的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);
但这没有任何作用。
任何想法如何旋转图像?非常感谢!
答案 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对象并在保存图像时将其作为输入流的一部分传递就可以了。