如何协调相机预览尺寸和图片尺寸之间的纵横比差异

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

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

我知道有不同的纵横比意味着将有部分矩形不重叠,但我没有足够接近边缘,这应该是一个问题。

如果无法直接了解预览和照片地图,有没有办法确定它们如何映射到本地相机? 如果我能够以编程方式检测本机相机长宽比,我可能能够确定裁剪scheme。

Solutions Collecting From Web of "如何协调相机预览尺寸和图片尺寸之间的纵横比差异"

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

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

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

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

我不太清楚你要求什么,但预览尺寸实际上不是由你的布局决定的。 如何显示是由布局决定的。 我假设你正在使用SurfaceView来保存你的预览/相机对象。

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

此外,您可以通过使用从onSurfaceChanged()获得的宽度和高度来获得“显示”预览的尺寸(它是水平线callback的一部分)

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

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

byte []数据是YUV格式的,你可能需要在转换之前将其转换成位图。 但除此之外,它将具有与调用getPreviewSize所获得的维相同的维数