繁体   English   中英

如何旋转相机预览以纵向模式拍摄风景照片?

[英]How do I rotate a Camera preview to take landscape photos in portrait mode?

我收到了很多想拍摄人像照片的建议,告诉他们将相机旋转90度。 但是,无论我尝试什么,唯一能真正“旋转”的是相机拍摄的图像,但它会保留其宽度和高度比例,因此发生的情况是,只有在SurfaceView狭窄且高。

我要实现的是拍摄一张4x3的照片,该照片在3x4布局中没有变形。 我知道它会很窄,但目的是将“预览”视图旋转-90度,同时保持相机的正常纵横比。 就目前而言,如果我想将照片定向在我的肖像布局上,我尝试过的一切都会导致图像被压缩。

我开始怀疑是否需要将一个矩阵应用于Preview并将其旋转-90度,但是我不确定该怎么做,或者这是否是正确的方法。 会喜欢一些建议。

编辑:为了清楚起见,这是来自javadocs的相关摘录:setPreviewSize()“如果显示方向设置为0或180,则预览大小应设置为480x320。如果显示方向设置为90或270,则预览大小应该设置为320x480。”

这完全无法解决您想要将设备保持在纵向模式但将相机预览显示在一个小的横向窗口中的情况(这是我要实现的目标)。

TIA

如果您使用SurfaceView来显示相机预览输出,并且想要确保预览不失真(在预览或横向模式下),则必须确保SurfaceView的纵横比与相机的纵横比匹配预览尺寸。 SurfaceView会简单地缩放预览以使其适合自身,因此,如果预览尺寸为640x480,缩放比例为500x500,则预览看起来会垂直拉伸。

从概念上讲,最简单的方法是通过使用LayoutParamssetLayoutParams将SurfaceView的布局更新为固定大小的布局,从而简单地手动设置SurfaceView的宽度和高度。 这种方法的问题是,在不同的屏幕尺寸下,它可能会很脆弱,因为您需要确定您真正想要的像素大小,并且对于Android上的直接跨设备布局,您真的想在dp中进行思考而不是像素。 但是对于测试,您可以强制SurfaceView设置测试设备屏幕的宽度,并通过以下方式设置高度:

surface height = preview height / preview width * surface width

更好的方法是创建一个从SurfaceView继承的新类,该类在View的onMeasure方法中进行必要的宽高比调整。 详细解释很长,但是请查看Android开发人员网站上的自定义组件文档以了解详细信息。 但粗略地说,您需要设置宽度/高度值,以始终获得与您配置的摄像机预览尺寸相同的宽高比。

拥有合适尺寸的surfaceView之后,通常还需要使用setDisplayOrientation旋转相机预览输出; 计算方向数学可能会造成混淆,因此请使用上面的文档链接中提供的代码示例进行计算。

基本上,世界有一个坐标系,摄像头传感器有另一个坐标系(固定在设备上),UI系统有第三个坐标系(固定在您当前的方向上),所有这三个坐标可能会相对变化。 尽管正确的预览方向不取决于设备相对于世界的位置,但相机拍摄的图片的方向却取决于(由setRotation设置)。

我的建议是

不要在Android的Layout上尝试更多,很难做到这一点。如果您想实现这一点,则必须阅读Android的开源代码,并且必须对其进行更改。

因此,我建议您使用Canvas(导入图形包)并使用这些类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM