9

我们一直在构建一个自定义的 Android 相机 Activity,其中一个矩形覆盖在相机预览中,当拍摄照片时(按下按钮),我们想要裁剪最终图像的相应矩形区域。问题是我们还没有弄清楚android是如何将预览屏幕映射到最终图像的。

我们尝试了以下公式,但仅在某些情况下有效:

让 x 和 y 为矩形左上角的坐标,如相机预览中所示。

让 preview_width 和 preview_height 为相机预览的宽度和高度。这些是使用 getBestPreviewSize() 函数获得的,该函数循环支持的预览尺寸并选择较大的。假设它们是 1280 和 720。

令 picture_width 和 picture_height 为相机支持的最终图片的宽度和高度。出于我们的目的,假设这是 1632 * 1224(在索尼爱立信 XPERIA 上,这对应于 2 MP)。

我们要找到 x_map, y_map,它们是最终图像的裁剪矩形的 x 和 y。

然后根据类比规则,我们使用的公式是:

x_map = 图片宽度 * x / 预览宽度;y_map = 图片高度 * y / 预览高度;

但是,这似乎并不适用于所有情况。我们发现,当手机的屏幕尺寸与预览尺寸相近时,这个公式几乎可以工作(大约,有一点误差)。

然而,对于其他情况,如索尼 XPERIA 手机,屏幕尺寸为:宽度:480 和高度:854,公式失败。

例如,对于 x=50,则 x_map = 1632 * 50 / 1280 = 63.75 但是这个数字,如从最终图片中裁剪的矩形区域所示,并不真正对应于预览区域中的矩形。很遥远。我们的公式没有考虑屏幕尺寸,尽管尝试修改它以考虑它们,但并没有产生任何理想的结果。

我们怀疑预览尺寸和最终图片之间的映射以某种方式考虑了屏幕尺寸,但还没有弄清楚到底是多少,因为没有关于它的文档,并且在网络上广泛搜索答案后,没有任何相关信息出现。我们认为,在应用类比规则之前,我们需要考虑一定的比例因子和纵横比,才能使公式正常工作。

你知道上面的正确公式吗?

4

1 回答 1

1

首先,获取返回的最大图片尺寸Camera.getSupportedPictureSizes- 这是您的相机的原始分辨率,您可以从中确定原始纵横比。任何具有不同纵横比的图片尺寸或预览尺寸都将根据“Matrix.ScaleToFit.CENTER”进行裁剪。

另请参阅: https ://stackoverflow.com/a/18159351/994834

于 2013-08-12T02:00:00.987 回答