安卓如何处理预览尺寸/比例与实际SufaceView尺寸之间的差异?

8
我正在编写一个小型的Android应用程序,用户可以将图像放置在相机的实时预览中并拍摄此图像。然后,应用程序将适当地组合这两个图像 - 所有这些都运行良好。
我了解您可以使用Camera.getParameters()获取/设置PreviewSize,我认为这与实时“摄像头反馈”的大小有关。
但是,显示相机预览的SurfaceView的大小与报告的(和使用的)PreviewSizes不同。例如,在模拟器中,我的可用SurfaceView恰好为360x215,而PreviewSize为320x240。仍然,整个SurfaceView都填充了预览。
但最终生成的图片也是320x240。Android如何弥补这些大小和纵横比的差异?图片是否被截断?
或者我是否简单地误解了PreviewSize的含义 - 这是否与生成的图片的大小有关,还是与投射在SurfaceView上的“实时预览”有关?是否有任何处理此类问题的非平凡相机示例?
我需要知道发生了什么转换才能正确地将图像复制/缩放到照片中,因此有这些问题。

你可能想看一下我对类似问题的自问自答:https://dev59.com/sXXYa4cB1Zd3GeqP6XX2#18159351 - goto10
1个回答

1

我正在尝试自己解决这个问题。以下是我目前发现的:

  • 表面视图有一个名为mSurface的内部表面,实际上用作相机和编码器的输入。因此,这个缓冲区必须是您要进行录制的实际大小。
  • 您可以使用setFixedSize方法将此mSurface的大小设置为独立于SurfaceView的大小。
  • 现在,您可能想进行高清录制,因此mSurface需要1280x760分辨率,但SurfaceView不能那么大(假设您在手机上运行它,该手机具有WVGA屏幕)。因此,您尝试将其设置为小于1280x760的较小分辨率,同时保持相同的纵横比。
  • Android现在对高清缓冲区执行调整大小以获取预览分辨率,不进行裁剪,只是将其调整为SurfaceView的分辨率。
  • 因此,在此时设置给相机的mSurfacepreviewSize的分辨率相同,因此生成的视频录制也将具有相同的分辨率。

话虽如此,我仍在努力让我的VGA录制器在Nexus S上工作,它已经可以在LG Maha设备上使用了。:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接