2014-10-28 36 views
3

您是否可以提供實際的工作示例:如何使用MediaCapture元素拍攝和保存照片。我試過在MSDN尋找一個實際的解決方案,但沒有一個解釋或代碼實際上以簡單的方式描述了這個過程。如何在Windows Phone 8.1中以正確的旋轉,寬高比拍攝照片? (使用MediaCapture)

我需要拍照並將其保存到我的圖書館(我需要爲此顯示正確的預覽),但現在它旋轉了90度,我無法調整它。我已經嘗試設置視頻預覽的旋轉,它適用於預覽,但是當我這樣做時,寬高比全部錯誤,保存的圖像不正確。

來自第9頻道的例子也吸了。我只需要一個簡單的實現...

即時通訊使用運行時應用程序不是Windows Phone 8.1的Silverlight應用程序。

回答

5

我有同樣的問題,SetRecordRotation不適用於我。我找到了解決方法 - 拍照並旋轉圖像,效果很好。我使用的方法類似:

private async void CapturePhoto() 
    { 
     string photoPath = string.Empty; 
     ImageEncodingProperties format = ImageEncodingProperties.CreateJpeg(); 

     using (var imageStream = new InMemoryRandomAccessStream()) 
     { 
      await MediaCapture.CapturePhotoToStreamAsync(format, imageStream); 

      BitmapDecoder dec = await BitmapDecoder.CreateAsync(imageStream); 
      BitmapEncoder enc = await BitmapEncoder.CreateForTranscodingAsync(imageStream, dec); 

      enc.BitmapTransform.Rotation = BitmapRotation.Clockwise90Degrees; 

      await enc.FlushAsync(); 

      StorageFolder folder = ApplicationData.Current.LocalFolder; 
      StorageFile capturefile = await folder.CreateFileAsync("photo.jpg", CreationCollisionOption.GenerateUniqueName); 
      photoPath = capturefile.Name; 

      using (var fileStream = await capturefile.OpenAsync(FileAccessMode.ReadWrite)) 
      { 
       try 
       { 
        await RandomAccessStream.CopyAsync(imageStream, fileStream); 
       } 
       catch {} 
      } 
     } 
    } 

我修改的代碼示例從文章如何由Marco Siccardi捕獲您的Windows Phone 8.1運行時應用照片 http://dotnet.dzone.com/articles/how-capture-photo-your-windows-0

+0

您是否嘗試使用SetPreviewRotation而不是SetRecordRotation? – oguzhan 2017-02-02 14:16:13

0

您可以更改寬高比您的視頻預覽&通過設置MediaCapture.VideoDeviceController捕獲照片。

此外,您可以使用以下代碼直立設置視頻預覽。

MediaCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees); 

我在下面的鏈接中的另一篇文章中回答了類似的問題。希望能幫助到你。

https://stackoverflow.com/a/29875992/4672579

2

有貼在微軟GitHub的頁面是相關的兩個樣本,雖然他們面向Windows 10.不過,API應該在8/8.1的工作。

GetPreviewFrame:此示例不會鎖定頁面旋轉,並對預覽流應用糾正旋轉。它不使用SetPreviewRotation,因爲該方法比使用元數據方法更耗費資源。此示例不捕獲照片(只是預覽幀)

UniversalCameraSample:這一個確實捕獲照片,並支持縱向和橫向方向。下面是相關的部分:

var stream = new InMemoryRandomAccessStream(); 

try 
{ 
    await _mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), stream); 

    var photoOrientation = ConvertOrientationToPhotoOrientation(GetCameraOrientation()); 

    await ReencodeAndSavePhotoAsync(stream, photoOrientation); 
} 
catch (Exception ex) 
{ 
    Debug.WriteLine("Exception when taking a photo: {0}", ex.ToString()); 
} 

有了:

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

      var file = await KnownFolders.PicturesLibrary.CreateFileAsync("SimplePhoto.jpeg", CreationCollisionOption.GenerateUniqueName); 

      using (var outputStream = await file.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(); 
      } 
     } 
    } 

有在樣品仔細看看,看看如何獲​​得在首位相機的方位(給它一個呼叫正在在我發佈的第一個片段中製作)。

或者,如果您更喜歡視頻,您可以從最近的// build/conference中觀看camera session,其中包括一些相機樣本的漫遊。

相關問題