4

我从想要拍摄肖像照片的人那里看到很多建议,告诉他们将相机旋转 90 度。但是,无论我尝试什么,唯一真正“旋转”的是相机拍摄的图像,但是它保留了它的宽度和高度比例,所以发生的情况是,如果 SurfaceView 很窄,图片不会失真并且高。

我想要实现的是拍摄一张在 3x4 布局中不变形的 4x3 照片。我知道它会相当窄,但目标是将预览视图旋转 -90 度,同时保持相机的正常纵横比。就目前而言,如果我想在我的肖像布局中定位照片,我所做的一切都会导致图像被挤压。

我开始怀疑我需要将一个矩阵应用于将其旋转-90 度的预览,但我不确定如何去做,或者这是否真的是正确的方法。会喜欢一些建议。

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

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

TIA

4

2 回答 2

3

如果您使用 SurfaceView 显示相机预览输出,并且您想确保预览不失真,无论是在预览中还是在横向中,您必须确保 SurfaceView 的纵横比与相机的纵横比相匹配预览大小。SurfaceView 将简单地缩放预览以适应其自身,因此如果预览大小为 640x480 时它是 500x500,则预览看起来会垂直拉伸。

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

surface height = preview height / preview width * surface width

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

一旦你有了合适大小的surfaceView,你通常还需要使用setDisplayOrientation旋转相机预览输出;计算方向数学可能会令人困惑,因此请使用上面文档链接中提供的代码示例来计算它。

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

于 2013-02-25T21:12:27.140 回答
-6

我的建议是,

不要在 Android 中尝试更多的 Layout,这非常困难而且如果你想实现,你必须阅读 Android 的开源代码并且应该改变它本身。

所以,我建议你使用 Canvas(Import Graphics package) 并利用这些类。

于 2013-02-25T06:09:04.240 回答