android - android 如何处理预览大小/比例和实际 SufaceView 大小之间的差异?

标签 android camera surfaceview image preview

我正在编写一个小型 Android 应用程序,用户可以在其中将图像放入相机的实时预览中并为其拍照。然后,该应用程序将适本地组合两个图像——所有这些都运行良好。

我知道您可以使用 Camera.getParameters() 获取/设置 PreviewSize,我认为这与实时“相机馈送”的大小有关。

但是,显示相机预览的 SurfaceView 的大小与报告的(和使用的)PreviewSizes 不同。例如,在模拟器中我可用的 SurfaceView 恰好是 360x215,而 PreviewSize 是 320x240。不过,整个 SurfaceView 都充满了预览。

但最终生成的图片是(还是?)320x240。 android 如何补偿这些尺寸和宽高比的差异?图片是否被截断?

或者我只是误解了 PreviewSize 的含义 - 这与生成图片的大小有关,还是与投影在 SurfaceView 上的“实时预览”有关?是否有处理此问题的任何重要的相机示例?

我需要知道如何进行转换以最终将图像正确复制/缩放到照片中,因此出现了这些问题。

最佳答案

我正在尝试自己解决这个问题。这是我到目前为止发现的..

  • 表面 View 有一个称为 mSurface 的内部表面,它实际上用作相机馈送和编码器馈送。所以这个缓冲区必须是您想要进行录制的实际大小。
  • 您可以使用 setFixedSize 方法将此 mSurface 的大小设置为独立于 SurfaceView
  • 现在您可能想要执行高清录制,因此 mSurface 需要 1280x760 分辨率,但您的 SurfaceView 不能那么大(假设您在带 WVGA 屏幕的手机)。因此,您尝试设置为比 1280x760 更小的分辨率,同时保持相同的宽高比。
  • Android 现在在 HD 缓冲区上执行调整大小以获得预览分辨率,裁剪没有完成,它只是调整到 SurfaceView 分辨率
  • 因此此时您为相机设置的 mSurfacepreviewSize 具有相同的分辨率,因此生成的视频录制也将具有相同的分辨率.

话虽这么说,我仍在努力让我的 VGA 录像机在 Nexus S 上工作,但它在 LG Maha 设备上工作。 :)

关于android - android 如何处理预览大小/比例和实际 SufaceView 大小之间的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8795209/

相关文章:

android - 向 Android Cordova 插件添加依赖项

javascript - 相机功能不适用于 cordova.js/camera.js

android - 视频完成时从 surfaceview 清除视频帧

android - 绘制到 SurfaceView 时出现应用程序错误

javascript - 如何让 Chrome 停止询问我是否可以使用相机?

android - 如何从 MainActivity 暂停/恢复 SurfaceView?

android - Jetpack Compose 的方向

java - 在 TextView 中剪切内容

java - 如何获取 Activity 时间表的颜色?

c++ - 如何使用 GLFW 在 openGL 中旋转相机?