【问题标题】:How to reconcile difference in aspect ratio between camera preview size and picture size如何调和相机预览大小和图片大小之间的纵横比差异
【发布时间】:2013-08-08 17:26:49
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android camera surfaceview


    【解决方案1】:

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

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

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

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

    【讨论】:

    • @mpellegr 看看我最近发布的问题和答案:stackoverflow.com/questions/24394334/… 它包含我在使用这种方法的项目中使用的代码。
    • 此解决方案在左右和上下均发生裁剪时不起作用。我在华为mate 8中遇到过这种情况。
    【解决方案2】:

    我不太确定您要的是什么,但预览大小实际上并不是由您的布局决定的。它的显示方式由布局决定。我假设您正在使用 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 得到的尺寸相同

    【讨论】:

    • 对不起,我应该更清楚的。 根据我的布局限制选择预览尺寸。我遍历可用尺寸以选择最适合我的布局的尺寸。无论如何,我如何选择我的预览大小是一个单独的问题,与我的问题无关 - 当两者具有不同的纵横比时,如何将预览的矩形映射到图片的矩形。获取 onPreviewFrame 对我不起作用,因为我需要相机拍摄的照片,而不仅仅是预览的一帧。预览帧会小得多,不会同步到闪光灯等。
    猜你喜欢
    • 1970-01-01
    • 2012-02-06
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2014-10-21
    相关资源
    最近更新 更多