我们一直在构建一个自定义的Android相机活动,在相机预览中覆盖一个矩形,当捕捉到照片时(按下按钮),我们想要裁剪最终图像的相应矩形区域。问题是,我们还没有弄清楚android如何将预览屏幕映射到最终图像。
我们尝试了以下公式,但仅在某些情况下有效:
设x和y是摄像机预览中所示矩形左上角的坐标。
设preview_width和preview_height为相机预览的宽度和高度。这些是使用getBestPreviewSize()函数获取的,该函数循环遍历支持的预览大小并选择较大的预览大小。让我们假设它们是1280和720。
假设picture_width和picture_height是相机支持的最终图片的宽度和高度。对于我们的目的,假设这是1632 * 1224 (在Sony Ericsson XPERIA上,这对应于200万像素)。
我们想要找到x_map,y_map,它们是最终图像的裁剪矩形的x和y。
然后根据类比规则,我们使用的公式是:
x_map = picture_width *x/ preview_width;y_map = picture_height *y/ preview_height;
然而,这似乎并不是在所有情况下都有效。我们已经发现,当手机的屏幕尺寸与预览尺寸相似时,这个公式几乎是有效的(大约有一个小误差)。
然而,对于其他情况,如索尼XPERIA手机,其屏幕尺寸为:宽度: 480,高度: 854,公式失败。
例如,对于x=50,则x_map = 1632 * 50 / 1280 = 63.75然而,这个数字,如从最终图片裁剪的矩形区域所示,并不真正对应于预览区域中的矩形。这太离谱了。我们的公式没有考虑屏幕尺寸,尽管对其进行了修改以解释它们的实验并没有产生任何理想的结果。
我们怀疑预览尺寸和最终图片之间的映射以某种方式考虑了屏幕尺寸,但还没有弄清楚具体是如何考虑的,因为没有关于它的文档,并且在网络上广泛搜索了答案后,没有找到相关的结果。我们认为,在应用类比规则之前,我们需要考虑一定的比例因子和纵横比,才能使公式正常工作。
你知道上述的正确公式吗?
发布于 2013-08-12 10:00:01
首先,获取Camera.getSupportedPictureSizes
返回的最大图片尺寸-这是相机的原始分辨率,您可以从中确定原始纵横比。任何具有不同纵横比的图片大小或预览大小都将根据‘Matrix.ScaleToFit.CENTER’进行裁剪。
https://stackoverflow.com/questions/15581187
复制相似问题