Camera2 相机取景器预览拉伸

问题描述 投票:0回答:1

我正在使用camera2在我的应用程序中制作相机,我想使用CameraViewfinder,据我所知,它应该处理纠正方向和纵横比。但是,当我设置其分辨率并请求表面时,预览会垂直拉伸。我使用的分辨率是 3072x4080 (3:4),并且宽高比与取景器不匹配,因此看起来不正确。但是,我认为 CameraViewfinder 应该自动纠正这个问题?我正在使用

fillCenter
比例类型,其文档如下:

如果相机取景器的纵横比与其容器CameraViewfinder的纵横比不匹配,这可能会导致取景器被裁剪。

但是,我没有看到任何裁剪来纠正宽高比。这就是我请求预览表面的方式:

surfaceRequest = ViewfinderSurfaceRequest.Builder(
    resolution = resolution // Size(3072, 4080)
).build()
surfaceRequest?.let { request ->
    val surfaceListenableFuture: ListenableFuture<Surface> =
        binding.viewFinder.requestSurfaceAsync(request)

    Futures.addCallback(
        surfaceListenableFuture, object : FutureCallback<Surface> {
            override fun onSuccess(result: Surface?) {
                // use surface
            }

        },
        ContextCompat.getMainExecutor(requireContext())
    )
}

我将取景器包裹在

FrameLayout
中,并在我的 XML 中定义如下:

<androidx.camera.viewfinder.CameraViewfinder
    android:id="@+id/view_finder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="92dp"
    android:layout_marginTop="64dp"
    app:scaleType="fillCenter" />

我的视图上有边距,因为我的相机 UI 中有顶部/底部栏。

查看 我的相机Google 相机

我尝试获取取景器的纵横比,然后找到纵横比最接近的分辨率,但预览仍然失真。我需要做什么来纠正预览中的宽高比?

android android-camera2
1个回答
0
投票

找出问题所在。我需要在

populateFromCharacteristics(characteristics)
上调用
ViewfinderSurfaceRequest.Builder
,以便它具有相机正确显示预览的所有特征。如果谷歌更新他们的文档以表明这是一个必要的步骤,那就太好了。完整代码如下:

surfaceRequest = ViewfinderSurfaceRequest.Builder(photoPreviewUIModel.resolution)
    .populateFromCharacteristics(characteristics)
    .build()
© www.soinside.com 2019 - 2024. All rights reserved.