2013-11-28 2 views
3

Я реализовал свой собственный видоискатель и логику камеры для захвата изображений. Все работает отлично, за исключением некоторых странных проблем ориентации. Фотографии, сделанные с помощью моего приложения, могут быть в портретном или альбомном режиме. Когда я просматриваю фотографии с помощью встроенного приложения для фотографий, ориентация будет такой, как ожидалось. Когда я просматриваю фотографии с ПК во время подключения телефона vi USB, миниатюры всегда находятся в ландшафте, но когда я открываю файл, фотография будет правильно в портретном режиме. Когда я привязываю изображения в своем приложении к изображению Telerik PanAndZoom, то снова ориентация неверна.Неправильная ориентация захвата фотографий с помощью PhotoCaptureDevice

Здесь мой код инициализации.

Windows.Foundation.Size best; 
      // Initialize the camera, when available. 
      if (PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back)) 
      { 
       // Use the back camera. 
       best = FindBestResolutuion(CameraSensorLocation.Back, AspectRatio.R_16_9); 
       _captureDevice = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Back, best); 
       _captureDevice.SetProperty(KnownCameraPhotoProperties.FlashMode, 
      } 
      else if (PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Front)) 
      { 
       // Otherwise, use the front camera. 
       best = FindBestResolutuion(CameraSensorLocation.Front); 
       _captureDevice = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Front, best); 
      } 
      if (Math.Round(best.Width/best.Height, 1) == 1.3) 
       _detecteAspectRatio = AspectRatio.R_4_3; 
      else 
       _detecteAspectRatio = AspectRatio.R_16_9; 


      SetOrientation(this.Orientation); 
      //Set the VideoBrush source to the camera. 

      viewfinderBrush.SetSource(_captureDevice); 

Это код для захвата.

if (!_capturing) 
     { 
      _capturing = true; 
      _captureMemoryStream = new MemoryStream(); 
      _thumbnailMemoryStream = new MemoryStream(); 
      CameraCaptureSequence sequence = _captureDevice.CreateCaptureSequence(1); 
      sequence.Frames[0].CaptureStream = _captureMemoryStream.AsOutputStream(); 
      sequence.Frames[0].ThumbnailStream = _thumbnailMemoryStream.AsOutputStream(); 
      await _captureDevice.PrepareCaptureSequenceAsync(sequence); 
      await sequence.StartCaptureAsync(); 
      _capturing = false; 

      _captureDevice.SetProperty(KnownCameraPhotoProperties.LockedAutoFocusParameters, AutoFocusParameters.None); 
      //Set the stream position to the beginning. 
      _captureMemoryStream.Seek(0, SeekOrigin.Begin); 
      await _viewModel.CurrentSession.SavePictureAsync(_captureMemoryStream); 

     } 

Есть идеи?

ответ

5

Хорошо, я сам нашел проблему. В моей логике вращения я использовал неправильное свойство, чтобы сообщить устройству захвата, как обрабатывать текущую ориентацию телефона. я использовал:

_captureDevice.SetProperty(KnownCameraGeneralProperties.SpecifiedCaptureOrientation, rotation); 

Correct является:

_captureDevice.SetProperty(KnownCameraGeneralProperties.EncodeWithOrientation, rotation); 
+0

Вы можете указать, что вращение в коде? Ошибка получения ошибки – asitis

+1

Вращение - целое число, которое сообщает о степени вращения. При удержании телефона в ландшафте оно равно 0, в портретном режиме - -90, а в альбомном режиме - 180 – bitdisaster

+0

Спасибо, он решил мою проблему. –

Смежные вопросы