Повернуть CamerePreviewImageSource
Я пытаюсь повернуть CameraPreviewImageSource, чтобы он появился (только) в портретном режиме:
private async Task InitializeAsync()
{
this.cameraPreviewImageSource = new CameraPreviewImageSource();
DeviceInformationCollection devices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(Windows.Devices.Enumeration.DeviceClass.VideoCapture);
String backCameraId = devices.FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back).Id;
await cameraPreviewImageSource.InitializeAsync(backCameraId);
VideoEncodingProperties properties = await this.cameraPreviewImageSource.StartPreviewAsync();
double width = 1280;
double height = 720;
this.writeableBitmap = new WriteableBitmap( (int)width, (int)height );
this.capturePreview.Source = this.writeableBitmap;
this.writeableBitmapRenderer = new WriteableBitmapRenderer();
this.jpegRenderer = new JpegRenderer();
this.cameraPreviewImageSource.PreviewFrameAvailable += OnPreviewFrameAvailable;
}
Я также пробовал в файле XAML, но в большинстве случаев результат странный (например, 90% изображения скрыто):
<Image x:Name="capturePreview" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="3" Grid.RowSpan="3" Width="auto" Height="auto" Canvas.ZIndex="0" >
<Image.RenderTransform>
<CompositeTransform CenterX="0.5" CenterY="0.5" Rotation="90" />
</Image.RenderTransform>
</Image>
Есть идеи?
2 ответа
Попробуйте этот переключатель, Ширина и Высота, и добавьте RotationFilter с поворотом, установленным на 90. Также установите для параметра " Ориентация устройства" значение " Портрет". Если вы хотите иметь поддержку другой ориентации в остальной части приложения, просто установите Ориентацию в OnNavigatedTo/OnNavigatedFrom.
private async Task InitializeAsync()
{
this.cameraPreviewImageSource = new CameraPreviewImageSource();
DeviceInformationCollection devices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(Windows.Devices.Enumeration.DeviceClass.VideoCapture);
String backCameraId = devices.FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back).Id;
await cameraPreviewImageSource.InitializeAsync(backCameraId);
VideoEncodingProperties properties = await this.cameraPreviewImageSource.StartPreviewAsync();
double width = 1280;
double height = 720;
this.writeableBitmap = new WriteableBitmap( (int)height, (int)width );
this.capturePreview.Source = this.writeableBitmap;
var effect = new FilterEffect(m_cameraPreviewImageSource);
effect.Filters = new IFilter[] { new RotationFilter(90) };
this.writeableBitmapRenderer = new WriteableBitmapRenderer(effect);
this.jpegRenderer = new JpegRenderer();
this.cameraPreviewImageSource.PreviewFrameAvailable += OnPreviewFrameAvailable;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
m_displayOrientations = DisplayInformation.AutoRotationPreferences;
DisplayInformation.AutoRotationPreferences = DisplayOrientations.Portrait;
NavigationHelper.OnNavigatedTo(e);
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
DisplayInformation.AutoRotationPreferences = m_displayOrientations;
NavigationHelper.OnNavigatedFrom(e);
}
Поскольку для этого вы используете Nokia Imaging SDK, пробовали ли вы добавить RotateFilter в цепочку рендеринга и поворачивать его при необходимости?
Ваша цепочка будет: CameraPreviewSource -> FilterEffect [ rotateFilter] -> WriteableBitmapRenderer.