2013-06-22 3 views
2

У меня возникли проблемы с ориентацией моей видеоролики, отображающей фотокамеру на моем телефоне. Это на самом деле должно быть гибким, как встроенная в приложении камеры, что означает, что он должен работать навращение видеоролика для фотообъектива

  • всех соотношений сторон
  • обе камеры (сзади и спереди)
  • и все страницы ориентаций

По крайней мере, один из них всегда ошибочен. Я попробовал https://projects.developer.nokia.com/cameraexplorer, чтобы заставить его работать, но даже он имеет лучший подход, он не работает для меня на разных ориентациях страниц, и передняя камера вращается неправильно (против часовой стрелки, когда я поворачиваю свой телефон по часовой стрелке, поэтому я перевернутый).

Есть ли код-фрагмент с полной рабочей видеороликой для камеры?

ответ

7

Для корректного отображения видоискателя, необходимо две информации:

  • ориентации: просмотр ориентации изображения по отношению к вашей странице ориентации
  • Масштаб: коэффициент между размером изображения предварительного просмотра и управления XAML.

В первом вам нужен холст с VideoBrush в качестве фона

<Canvas x:Name="viewfinderCanvas" Width="480" Height="800" > 
    <Canvas.Background> 
     <VideoBrush x:Name="viewfinderBrush" Stretch="None" /> 
    </Canvas.Background> 
</Canvas> 

Вы должны использовать Stretch = "None" или XAML будет применять шкалу на viewbrush. Теперь вам нужно преобразование viewfinderBrush, чтобы отобразить его правильно. По умолчанию центр холста соответствует центру предварительного просмотра, поэтому нам нужно вычислить угол, масштабный коэффициент и использовать центр холста в качестве центра преобразования.

Для вычисления угла нужно:

  • датчик ориентации по отношению к ориентации устройства Портрет. Эта величина определяется как PhotoCaptureDevice.SensorRotationInDegrees.
  • Ориентация на страницу относительно устройства Ориентация на портрет.

код:

double ComputeAngle(PageOrientation orientation) 
{ 
    if ((orientation & PageOrientation.Portrait) == PageOrientation.Portrait) 
    { 
     return m_captureDevice.SensorRotationInDegrees; 
    } 
    else if ((orientation & PageOrientation.LandscapeLeft) == PageOrientation.LandscapeLeft) 
    { 
     return m_captureDevice.SensorRotationInDegrees - 90; 
    } 
    else //PageOrientation.LandscapeRight 
    { 
     return m_captureDevice.SensorRotationInDegrees + 90; 
    } 
} 

Масштаб просто фактор между размерностью холста и размера предварительного просмотра изображения:

//orient preview picture size from the computed anle. 
var tmp = new CompositeTransform(){Rotation = ComputeAngle(currentPageOrientation)}; 
var previewSize = tmp.TransformBounds (new Rect(new Point(), new Size(m_captureDevice.PreviewResolution.Width, m_captureDevice.PreviewResolution.Height))).Size; 
double s1 = viewfinderCanvas.Width/ (double)previewSize.Width; 
double s2 = viewfinderCanvas.Height/ (double)previewSize.Height; 
  • При использовании максимального коэффициента, вы делаете Fit out => scale = Math.Max ​​(s1, s2)
  • Если вы используете минимальный коэффициент, вы делаете В приступе => шкала = Math.min (s1, s2)

Передняя и задняя камера имеет свое направление глаз противоположное. Поэтому, чтобы правильно отобразить переднюю камеру, вам нужно применить зеркало в одном измерении. Ориентация датчика WP8 обычно равна 90 °, поэтому размер Y противоположный.

if (sensorLocation == CameraSensorLocation.Back) 
{ 
    viewfinderBrush.Transform = new CompositeTransform() { 
         Rotation = ComputeAngle(currentPageOrientation), 
         CenterX = viewfinderCanvas.Width/2, 
         CenterY = viewfinderCanvas.Height/2, 
         ScaleX = scale, 
         ScaleY = scale }; 
} 
else 
{ 
    viewfinderBrush.Transform = new CompositeTransform() { 
         Rotation = ComputeAngle(currentPageOrientation), 
         CenterX = viewfinderCanvas.Width/2, 
         CenterY = viewfinderCanvas.Height/2, 
         ScaleX = scale, 
         ScaleY = -1 * scale };//Y mirror 
} 

Вы можете найти последнюю версию образца на GitHub: https://github.com/yan-verdavaine/wp8-sample/tree/master/Imaging/ViewFinder

+0

Странно голосовать -1 по коду, который отвечает на исходную проблему: /. Если я ошибаюсь, не могли бы вы объяснить мне? – yan

+1

Ссылка только ответы не предпочтительны на SO, поскольку содержимое, на которое они указывают, может быть изменено или отменено, попробуйте добавить код для своего образца к вашему ответу. – Amicable

+0

Хорошо спасибо. Я добавлю больше объяснений позже. – yan

0

Не могли бы вы решить эту проблему? Я узнал то же поведение, когда использовалась передняя камера.

Я применил поворот поворота (угол = 180 °) на прямоугольник (в котором размещен элемент видеобраны), и он работал. Я также изменил значение свойства EncodeWithOrientation на моем объекте AudioVideoCaptureDevice, и записанный фильм также был в порядке. Это решение работает только в портретном режиме, однако, когда вы переходите в ландшафт, все идет не так, поэтому этот tecnique действительно не решает проблему. Может быть, это ошибка в SDK?

+0

Tahnks для вашего ответа. Прямо сейчас я взял код из Nokias Imaging SDK Demo «Фильтрующие эффекты», где он работает очень хорошо во всех направлениях. http://developer.nokia.com/Resources/Library/Lumia/#!nokia-imaging-sdk/sample-projects/filter-effects.html – Matt

3

Вопрос старый, но все равно нет ответа в Интернете о неправильном направлении, при использовании передней камеры. Чтобы решить эту проблему, вам необходимо изменить направление оси VideBrush X. Вот фрагмент кода о том, как это сделать:

if (cameraType == CameraType.Primary) 
      { 
       viewfinderBrush.RelativeTransform = 
        new CompositeTransform() { CenterX = 0.5, CenterY = 0.5, Rotation = 90 }; 
      } 
      else 
      { 
       viewfinderBrush.RelativeTransform = 
             new CompositeTransform() { CenterX = 0.5, CenterY = 0.5, Rotation = 90, ScaleX = -1 };      
      } 
+0

ScaleX & ScaleY ценности решили мою проблему ... Спасибо .. –