为什么CameraX无法在Android Studio中放大所需的图片?

时间:2019-11-15 08:10:08

标签: android kotlin zoom android-camerax

我正在学习CameraX,CameraXBasic是示例代码。

我写了一个基于CameraFragment.kt的zoomX函数。您可以看到代码A。我认为该功能可以随时放大图片。

我发现以较小的值(例如zoomX(2f)zoomX(3f))调用图片时,图片可以放大,但是使用较大的值时,图片将不会再次放大。例如zoomX(6.0f)zoomX(7.0f) ...为什么?

代码A

   private lateinit var viewFinder: TextureView 
    private var preview: Preview? = null

    fun zoomX(orign: Float ){       
        val x=orign+1

        val singleWidth=viewFinder.width/x
        val singleHeight=viewFinder.height/x

        val left=viewFinder.width/2f-singleWidth/2f
        val right=left+singleWidth
        val top=viewFinder.height/2f-singleHeight/2f
        val bottom=top+singleHeight

        val my= Rect(left.toInt(), top.toInt(), right.toInt(), bottom.toInt())
        preview?.zoom(my)      
    }

3 个答案:

答案 0 :(得分:2)

这不是传统问题,而是Futures。将CameraXBasic的示例从1.0.0-alpha06更新为1.0.0-alpha08会遇到很多麻烦,但是CameraX CameraControl具有以下两种方法:

  

通过介于0f1.0f之间的线性缩放值设置当前缩放。

     

linearZoom 0f表示最小缩放,而linearZoom 1.0f表示最大缩放。 linearZoom的优点在于,它可以确保视场(FOV)随linearZoom值线性变化,以便与滑块UI元素一起使用(而setZoomRatio(float)可以很好地捏住缩放手势)。

  

设置当前缩放比例。

     

它同时修改了当前的zoomRatiolinearZoom,因此,如果应用程序正在观察zoomRatiolinearZoom,它们也会获得更新。如果该比例小于CameraInfo.getMinZoomRatio()或大于CameraInfo.getMaxZoomRatio(),则返回的ListenableFuture将失败,并显示IllegalArgumentException,并且不会修改当前的缩放比例。限制比率是应用程序的职责。

另请参阅ExecutorCameraXExecutors


有关所有API更改,另请参见release notescommits ...,这违反了CameraXBasic示例。我不会再解释这些API差异了(因为这不是问题),而是have forked;请参见issues #131(到目前为止,至少在那里可以进行预览)。


这实际上是这样的:

val camera: Camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
val control: CameraControl = camera.cameraControl
control.setZoomRatio(5.0f)

1.0f8.0f的缩放比例在我的Motorola XT1900上起作用:

val info: CameraInfo = camera.cameraInfo
val cameraId = (info as Camera2CameraInfoImpl).cameraId
val zoomRatio = info.getZoomRatio().value
val maxZoomRatio = info.getMaxZoomRatio().value
val minZoomRatio = info.getMinZoomRatio().value
val linearZoom = info.getLinearZoom().value

答案 1 :(得分:0)

这是Android的传统,缩放级别与许多其他值一样,位于 0 1 之间。

0表示最低的缩放级别。

1表示最大缩放级别。

这是一个浮点值,因此您可以像0.10.20.9等那样增加它。

答案 2 :(得分:0)

首先,使用getMaxZoom()方法找出相机的最大变焦值。

https://developer.android.com/reference/android/hardware/Camera.Parameters.html#getMaxZoom()

如果您使用过“相机预览”,则可以使用Rect设置“相机预览”中的缩放。如下所示-

PreviewConfig config = new PreviewConfig.Builder().build();
    Preview preview = new Preview(config);

    Rect rect = Rect(left, top, right, bottom);
    preview.zoom(rect)

    preview.setOnPreviewOutputUpdateListener(
        new Preview.OnPreviewOutputUpdateListener() {
            @Override
            public void onUpdated(Preview.PreviewOutput previewOutput) {
                // Your code here. For example, use previewOutput.getSurfaceTexture()
                // and post to a GL renderer.
            };
    });

    CameraX.bindToLifecycle((LifecycleOwner) this, preview);

您可以从此处获得更多详细信息-Android Camera preview zoom using double finger touch