Android 如何协调相机预览大小和图片大小之间的纵横比差异

Android 如何协调相机预览大小和图片大小之间的纵横比差异,android,camera,surfaceview,Android,Camera,Surfaceview,我有一个相机应用程序,它根据我的布局特征(主要是纵横比)选择预览尺寸,然后根据其他约束条件(最小尺寸)选择图片尺寸。这通常会导致图片的纵横比与预览不同 这本身不是问题,但我需要将预览中的矩形映射到图片上的等效矩形,这样我就可以提取最终照片中拍摄照片时在预览中可见的相同区域 我知道有不同的长宽比意味着矩形的某些部分不会重叠,但我的工作距离不够近,这应该是一个问题 如果无法直接知道预览和照片如何映射,是否有方法确定它们如何映射到本机相机?如果我可以通过编程方式检测本机相机的纵横比,我可能可以确定裁剪

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

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

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


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

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

使用此方法可以获得实际的预览大小

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

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

这与onPreviewFrame(字节[]数据,摄像头)完全匹配


字节[]数据是YUV格式的,您可能需要先将其转换为位图,然后再进行处理。但除此之外,它的维度将与调用getPreviewSize时得到的维度相同。经过一些额外的尝试和错误,我得出了以下初步结论:

  • Camera.Parameters.getSupportedPictureSizes提供的最大图像大小表示相机的本机分辨率

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


  • 因此,考虑到这一点,我的解决方案是首先将预览选择矩形缩放到本机相机图片大小。然后,现在我知道本机分辨率的哪个区域包含我想要的内容,我可以执行类似的操作,然后将本机分辨率上的矩形缩放到根据
    Ca实际捕获的较小图片mera.Parameters.setPictureSize

    对不起,我应该说得更清楚。我是根据布局的约束选择预览大小的。我反复查看可用大小,以选择最适合布局的大小。无论如何,我如何选择预览大小是一个单独的问题,与我问题的主题无关-如何映射当两者具有不同的纵横比时,预览的矩形变为图片的矩形。进入预览帧对我不起作用,因为我需要相机拍摄的图片,而不仅仅是预览帧。预览帧会小得多,无法与闪光灯同步,等等@mpellegr看看我最近发布的问题和答案泰利:它包含我在项目中使用的使用这种方法的代码。这种解决方案在左右和上下两种情况下都不起作用。我在华为mate 8中遇到过这种情况。