设置缩小的相机预览以相对于宽度具有正确的图像纵横比
Posted
技术标签:
【中文标题】设置缩小的相机预览以相对于宽度具有正确的图像纵横比【英文标题】:Set a shrunken camera preview to have the correct image aspect ration with respect to width 【发布时间】:2013-06-20 10:08:10 【问题描述】:因此,在我的应用中,我正在显示一个不占用整个屏幕的相机预览。我正在手动设置显示,但我得到的图像纵横比不正确。我将显示宽度设置为当前屏幕尺寸的一半。然后我想设置相对于宽度的高度并保持正确的图像纵横比。如何在保持正确比例的同时设置相机预览高度?
【问题讨论】:
【参考方案1】:The AOSP Camera uses a PreviewFrameLayout
作为 SurfaceView
的包装器用于预览。他们根据从Camera
中选择的预览大小的纵横比在PreviewFrameLayout
上调用setAspectRatio()
,PreviewFrameLayout
相应地缩放SurfaceView
。
由于PreviewFrameLayout
是开源的,没有什么可以阻止您将其克隆到您自己的项目中,就像我在this one 中所做的那样。
因此,在您的情况下,您可以将 PreviewFrameLayout
设置为所需的最大尺寸(“当前屏幕尺寸的一半”,我希望您使用 LinearLayout
和 @ 987654333@),教它长宽比,把SurfaceView
放在PreviewFrameLayout
中,你应该很高兴。
请注意,您应该能够在SurfaceView
上设置android:layout_gravity
以使其在PreviewFrameLayout
中居中。
【讨论】:
我可以通过将FrameLayout
设置为屏幕宽度的50% 然后设置FrameLayout
高度和相机预览将自动填充它来做到这一点的更简单的方法
@WillJamieson:如果您认为这比使用为您完成所有这些工作的代码更简单,欢迎您这样做。请记住,纵横比由选定的预览帧大小决定——如果您的SurfaceView
的大小与相同的纵横比不同,图像将被拉伸。
我检查了你的代码,这正是我要找的。但是,我无法让它在纵向模式下顺利工作。你知道我怎样才能让它发挥作用吗?
@Ole-M:“我无法让它在纵向模式下顺利工作”——因为在这种情况下我不知道“顺利”是什么意思,更不用说必须做什么了纵向模式,我真的帮不了你。
@CommonsWare:好的,我指的是纵横比。但我在一段时间后修复了它。只需在 setAspectRatio() 中切换高度和宽度【参考方案2】:
我用这个解决了这个问题
private Camera.Size getBestPreviewSize(int width, int height)
Camera.Size result=null;
Camera.Parameters p = camera.getParameters();
for (Camera.Size size : p.getSupportedPreviewSizes())
if (size.width<=width && size.height<=height)
if (result==null)
result=size;
else
int resultArea=result.width*result.height;
int newArea=size.width*size.height;
if (newArea>resultArea)
result=size;
return result;
【讨论】:
以上是关于设置缩小的相机预览以相对于宽度具有正确的图像纵横比的主要内容,如果未能解决你的问题,请参考以下文章
Android Camera2 以 4:3 纵横比预览和捕捉,但宽度 > 高度