如何协调相机预览大小和图片大小之间的宽高比差异

时间:2013-08-08 17:26:50

标签: android camera surfaceview

我有一个相机应用程序,根据我的布局特征(主要是宽高比)选择预览尺寸,然后根据其他约束(最小尺寸)选择图片尺寸。这通常会导致图片的宽高比与预览不同。

这本身不是问题,但是我需要将预览中的矩形映射到图片上的等效矩形,以便我可以提取照片所在的预览中可见的最终照片的相同区域。服用。

据我所知,具有不同的宽高比意味着将会有部分矩形不重叠,但我的工作距离不够近,这应该是一个问题。

如果无法直接了解预览和照片地图的方式,是否有可能确定每个地图如何映射到原生相机?如果我能以编程方式检测本机相机宽高比,我可以确定裁剪方案。

2 个答案:

答案 0 :(得分:13)

经过一些额外的反复试验后,我得出了以下初步结论:

  1. Camera.Parameters.getSupportedPictureSizes提供的最大图像尺寸代表相机的原始分辨率。

  2. 其他图片尺寸的内容以及Camera.Parameters.getSupportedPreviewSizes提供的预览尺寸将按照Matrix.ScaleToFit.CENTER所述按比例缩放时与原生内容相匹配。 (基本上从中心开始缩放,直到顶部/底部或左/右击中原始分辨率的边界。如果纵横比不匹配,则裁剪发生在未达到原始分辨率边界的维度

  3. 所以,鉴于此,我的解决方案是首先将预览选择矩形缩放到原生相机图片大小。然后,现在我知道原始分辨率的哪个区域包含我想要的内容,我可以执行类似的操作,然后将原始分辨率上的矩形缩放到每Camera.Parameters.setPictureSize实际捕获的较小图片。

答案 1 :(得分:0)

我不太确定你要求的是什么,但预览尺寸实际上并不取决于你的布局。它的显示方式由布局决定。我假设您使用SurfaceView来保存预览/相机对象。

您可以使用此方法获取实际预览尺寸 http://developer.android.com/reference/android/hardware/Camera.Parameters.html#getPreviewSize()

此外,您可以使用从onSurfaceChanged()获得的宽度和高度来获取“显示”预览的尺寸(它是曲面支持回调的一部分)

我不确定这有多重要。但主要的一点是,你现在知道getPreviewSize()的实际预览大小,你可以做数学并相应地得到你的分数。

这与onPreviewFrame(byte []数据,相机相机完美匹配) http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html

byte []数据采用YUV格式,您可能需要先将其转换为位图,然后再进行处理。但除此之外,它将与调用getPreviewSize

时获得的尺寸相同