7

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

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

我知道具有不同的纵横比意味着矩形的某些部分不会重叠,但是我的工作距离边缘不够近,这应该是一个问题。

如果无法直接知道预览和照片如何映射,是否有办法确定它们如何映射到本机相机?如果我可以以编程方式检测本机相机纵横比,我可能能够确定裁剪方案。

4

2 回答 2

14

经过一些额外的试验和错误,我得出了以下初步结论:

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

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

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

于 2013-08-10T06:37:55.347 回答
0

我不太确定您要的是什么,但预览大小实际上不是由您的布局决定的。它的显示方式由布局决定。我假设您正在使用 SurfaceView 来保存您的预览/相机对象。

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

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

我不确定这有多重要。但主要的一点是,现在您从 getPreviewSize() 知道了实际的预览大小,您可以进行数学运算并获得相应的分数。

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

byte[]data 是 YUV 格式,您可能需要先将其转换为位图,然后再进行处理。但除此之外,它的尺寸与您通过调用 getPreviewSize 获得的尺寸相同

于 2013-08-09T02:39:21.560 回答