我使用MediaCapture API创建了一个相机应用程序,并尝试相对于用户持有设备的方式显示预览。例如,应用程序假定用户正在以纵向模式持有设备并显示此类设备,但当用户将设备向左或向右旋转90度时,我如何判断用户是时钟还是逆时针转动设备相应地显示Feed。
我知道我可以将屏幕方向设置为横向或纵向,但这并不能告诉我应该旋转多少Feed。
感谢。
答案 0 :(得分:1)
使用Windows.Graphics.Display.DisplayInformation类(通过DisplayInformation.getForCurrentView()获取)及其currentOrientation属性中的值。这标识了设备相对于其原始方向可能的四个旋转象限之一:landscape,portrait,landscapeFlipped和portraitFlipped。还有一个orientationchanged事件可用于检测更改(请参阅Display orientation sample的方案3以了解此事件的使用情况。)
答案 1 :(得分:0)
您可以使用SimpleOrientation
传感器通过应用确定设备方向,查看 here
答案 2 :(得分:0)
Microsoft github页面上发布了两个相关的样本,尽管它们的目标是Windows 10.但是,API应该适用于8 / 8.1。
GetPreviewFrame:此示例不会锁定页面旋转,并将校正旋转应用于预览流。它不使用SetPreviewRotation
,因为该方法比使用元数据方法更耗费资源。此示例不会捕获照片(只是预览帧)。
UniversalCameraSample:虽然它试图将页面锁定为横向(通过AutoRotationPreferences
),但它会捕捉照片并支持纵向和横向方向。
以下是第一个示例处理方向更改的方式:
private async void DisplayInformation_OrientationChanged(DisplayInformation sender, object args)
{
_displayOrientation = sender.CurrentOrientation;
if (_isPreviewing)
{
await SetPreviewRotationAsync();
}
}
private async Task SetPreviewRotationAsync()
{
// Calculate which way and how far to rotate the preview
int rotationDegrees = ConvertDisplayOrientationToDegrees(_displayOrientation);
// 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);
}
private static int ConvertDisplayOrientationToDegrees(DisplayOrientations orientation)
{
switch (orientation)
{
case DisplayOrientations.Portrait:
return 90;
case DisplayOrientations.LandscapeFlipped:
return 180;
case DisplayOrientations.PortraitFlipped:
return 270;
case DisplayOrientations.Landscape:
default:
return 0;
}
}
仔细查看示例,了解如何获取所有详细信息。或者,要进行演练,您可以观看最近//版本/会议中的camera session,其中包括一些相机示例的演练。