gpt4 book ai didi

android - 如何旋转相机预览以在人像模式下拍摄风景照片?

转载 作者:太空宇宙 更新时间:2023-11-03 11:26:43 26 4
gpt4 key购买 nike

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

我想要实现的是拍摄一张在 3x4 布局中不变形的 4x3 照片。它会相当窄,我知道,但目标是将预览 View 旋转 -90 度,同时保持相机的正常纵横比。就目前而言,如果我想在纵向布局中调整照片的方向,我尝试过的所有操作都会导致图像被压扁。

我开始怀疑我是否需要将矩阵应用于预览,将其旋转 -90 度,但我不确定该怎么做,或者这是否真的是正确的方法。希望得到一些建议。

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

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

TIA

最佳答案

如果您使用 SurfaceView 来显示相机预览输出,并且您想要确保您的预览不失真,无论是在预览中还是在风景中,您必须确保 SurfaceView 的纵横比与纵横比相匹配相机预览尺寸。 SurfaceView 将简单地缩放预览以适合自身,因此如果它是 500x500 而你的预览尺寸是 640x480,预览将看起来垂直拉伸(stretch)。

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

设置的高度
surface height = preview height / preview width * surface width

更好的方法是创建一个继承自 SurfaceView 的新类,它在 View 的 onMeasure 中进行必要的宽高比调整。方法。详细解释很长,但请查看 custom components documentation有关详细信息,请访问 Android 开发人员网站。但粗略地说,您需要设置宽度/高度值,使纵横比始终与您配置的相机预览尺寸相同。

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

基本上,世界有一个坐标系,相机传感器有另一个(固定在设备上),UI 系统有第三个(固定在您当前的方向),这三个坐标系可能会相互改变。虽然正确的预览方向不取决于设备相对于世界的位置,但相机拍摄的照片的方向确实如此(由 setRotation 设置)。

关于android - 如何旋转相机预览以在人像模式下拍摄风景照片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15061003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com