2015-11-03 58 views
1

我在C#和VS2013中为Lumia 640 XL WP 8.1编写了一个简单的代码,就像一个示例照片应用程序。不错,但它有一个小问题:当图片保存到媒体中时,则此图片向左旋转90度。如何在WP8.1中旋转CaptureManager保存的照片

这里是我的设置预览区码:

captureManager = new MediaCapture(); 
await captureManager.InitializeAsync(); 
captureManager.SetPreviewRotation(VideoRotation.Clockwise90Degrees); 
captureManager.SetRecordRotation(VideoRotation.Clockwise90Degrees); 
cptElement.Source = captureManager; 
await captureManager.StartPreviewAsync(); 

这里是捕获代码:

ImageEncodingProperties imgFormat = ImageEncodingProperties.CreateJpeg(); 
StorageFile file = await KnownFolders.PicturesLibrary.CreateFileAsync("Photo.jpg", CreationCollisionOption.GenerateUniqueName); 
await captureManager.CapturePhotoToStorageFileAsync(imgFormat, file); 

所以,你可以看到,我试图旋转终于在这张照片命令行:

captureManager.SetRecordRotation(VideoRotation.Clockwise90Degrees); 

但它没有奏效。

在这种情况下我该做什么?

感谢您的帮助,并为我的纯英语感到抱歉。

回答

0

你应该看看CameraStarterKit SDK sample。它会告诉你怎么做的旋转:

前瞻:

/// <summary> 
/// Gets the current orientation of the UI in relation to the device (when AutoRotationPreferences cannot be honored) and applies a corrective rotation to the preview 
/// </summary> 
private async Task SetPreviewRotationAsync() 
{ 
    // Only need to update the orientation if the camera is mounted on the device 
    if (_externalCamera) return; 

    // Calculate which way and how far to rotate the preview 
    int rotationDegrees = ConvertDisplayOrientationToDegrees(_displayOrientation); 

    // The rotation direction needs to be inverted if the preview is being mirrored 
    if (_mirroringPreview) 
    { 
     rotationDegrees = (360 - rotationDegrees) % 360; 
    } 

    // Add rotation metadata to the preview stream to make sure the aspect ratio/dimensions match when rendering and getting preview frames 
    var props = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview); 
    props.Properties.Add(RotationKey, rotationDegrees); 
    await _mediaCapture.SetEncodingPropertiesAsync(MediaStreamType.VideoPreview, props, null); 
} 

照片:

/// <summary> 
/// Takes a photo to a StorageFile and adds rotation metadata to it 
/// </summary> 
/// <returns></returns> 
private async Task TakePhotoAsync() 
{ 
    // While taking a photo, keep the video button enabled only if the camera supports simultaneously taking pictures and recording video 
    VideoButton.IsEnabled = _mediaCapture.MediaCaptureSettings.ConcurrentRecordAndPhotoSupported; 

    // Make the button invisible if it's disabled, so it's obvious it cannot be interacted with 
    VideoButton.Opacity = VideoButton.IsEnabled ? 1 : 0; 

    var stream = new InMemoryRandomAccessStream(); 

    try 
    { 
     Debug.WriteLine("Taking photo..."); 
     await _mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), stream); 
     Debug.WriteLine("Photo taken!"); 

     var photoOrientation = ConvertOrientationToPhotoOrientation(GetCameraOrientation()); 

     await ReencodeAndSavePhotoAsync(stream, photoOrientation); 
    } 
    catch (Exception ex) 
    { 
     // File I/O errors are reported as exceptions 
     Debug.WriteLine("Exception when taking a photo: {0}", ex.ToString()); 
    } 
} 

和视频:

/// <summary> 
/// Records an MP4 video to a StorageFile and adds rotation metadata to it 
/// </summary> 
/// <returns></returns> 
private async Task StartRecordingAsync() 
{ 
    try 
    { 
     // Create storage file in Pictures Library 
     var videoFile = await KnownFolders.PicturesLibrary.CreateFileAsync("SimpleVideo.mp4", CreationCollisionOption.GenerateUniqueName); 

     var encodingProfile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto); 

     // Calculate rotation angle, taking mirroring into account if necessary 
     var rotationAngle = 360 - ConvertDeviceOrientationToDegrees(GetCameraOrientation()); 
     encodingProfile.Video.Properties.Add(RotationKey, PropertyValue.CreateInt32(rotationAngle)); 

     Debug.WriteLine("Starting recording..."); 

     await _mediaCapture.StartRecordToStorageFileAsync(encodingProfile, videoFile); 
     _isRecording = true; 

     Debug.WriteLine("Started recording!"); 
    } 
    catch (Exception ex) 
    { 
     // File I/O errors are reported as exceptions 
     Debug.WriteLine("Exception when starting video recording: {0}", ex.ToString()); 
    } 
} 

但是你应该看看全样本查看方向/旋转信息来自何处,并获得帮助器功能。