¿Por qué CameraX no puede ampliar una imagen tan grande como la que necesito en Android Studio?

8

Estoy aprendiendo CameraX, y CameraXBasic es un código de muestra.

Escribo una función zoomX basada en CameraFragment.kt . puede ver el Código A. Creo que la función puede ampliar una imagen en cualquier momento.

Me parece que una imagen puede ser zoom en cuando me lo debe invocar con sa pequeño valor, tales como zoomX(2f), zoomX(3f)pero la imagen no será ampliar de nuevo cuando se utiliza un gran valor tales como zoomX(6.0f), zoomX(7.0f)... ¿por qué?

Código 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)      
    }
HolaCW
fuente
Se puede utilizar CameraControl.setZoomPercentage()desdeandroidx.camera.camera-core:1.0.0-alpha01
soneto
¡Gracias! ¿podría mostrarme más detalles al respecto CameraControl.setZoomPercentage()? No puedo encontrar más documentos y código de muestra.
HelloCW
Estaba equivocado. Es en el alpha07que aún no se ha lanzado. android.googlesource.com/platform/frameworks/support/+/… La última versión esalpha06
sonnet

Respuestas:

3

Esto no es una cuestión de tradición, sino de Futures. La actualización que CameraXBasic ejemplo, de 1.0.0-alpha06que 1.0.0-alpha08se rompe mucho, pero CameraX CameraControl características de estos dos métodos:

Establece el zoom actual mediante un valor de zoom lineal que va de 0fa 1.0f.

linearZoom 0frepresenta el zoom mínimo mientras que linearZoom 1.0frepresenta el zoom máximo. La ventaja de esto linearZoomes que garantiza que el campo de visión (FOV) varía linealmente con el linearZoomvalor, para usar con elementos de la IU del control deslizante (mientras setZoomRatio(float)funciona bien para los gestos de pellizco-zoom).

Establece el zoom actual por relación.

Modifica tanto actual zoomRatiocomo linearZoomsi las aplicaciones están observando zoomRatioo linearZoom, también recibirán la actualización. Si la relación es menor CameraInfo.getMinZoomRatio()o mayor que CameraInfo.getMaxZoomRatio(), la devolución ListenableFuturefallará IllegalArgumentExceptiony no modificará la relación de zoom actual. Es deber de las aplicaciones fijar la relación.

También vea Ejecutor y también hay CameraXExecutors.


También vea las notas de la versión o las confirmaciones ... para todos los cambios de API, que rompen el ejemplo de CameraXBasic. No explicaré más de estas diferencias de API (ya que esta no era la pregunta), pero la bifurqué ; vea los problemas # 131 (hasta ahora, al menos la vista previa funciona allí).


Así es como funciona realmente:

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

Relaciones de zoom desde 1.0fhasta el 8.0ftrabajo en mi 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
Martin Zeitler
fuente
¡Muchas gracias! ¿Podría mostrar un código de muestra completo? entonces puedo correr y probarlo.
HelloCW
Por cierto, el proyecto CameraXBasic no se puede ejecutar después de actualizarlo de 1.0.0-alpha06 a 1.0.0-alpha08.
HelloCW
¡Gracias! Parece que la fusión aún no se ha realizado, por lo que no puedo llevarla a mi PC para probar. ¿Podría darme una bifurcación temporal para extraer el código y probarlo?
HelloCW
Por cierto, soy un principiante de GitHub, no sé cómo sacar de github.com/android/camera-samples/compare/…
HelloCW
En la actualidad, solo puedo tirar del tenedor caren / tap_to_focus, pero está basado en "1.0.0-alpha05"
HelloCW
0

Es una tradición de Android, existe un nivel de zoom entre 0y 1como muchos otros valores.

0 significa el nivel de zoom más bajo.

1 significa el nivel máximo de zoom.

Es un valor de coma flotante por lo que se aumenta como 0.1, 0.2, 0.9y así sucesivamente.

Ibrahim Ali
fuente
0

En primer lugar, descubra el valor máximo de zoom de la cámara, utilizando el getMaxZoom()método.

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

Si ha usado Vista previa de la cámara, puede configurar el zoom en Vista previa de la cámara usando Rect. Como abajo -

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);

Puede obtener más detalles desde aquí: zoom de la vista previa de la cámara de Android con solo tocar dos dedos

Al-Amin
fuente
¡Gracias! pero CameraX no es compatible con getMaxZoom ().
HelloCW