Por que o CameraX não pode ampliar uma imagem tão grande quanto eu preciso no Android Studio?

8

Estou aprendendo o CameraX e o CameraXBasic é um código de exemplo.

Escrevo uma função zoomX baseada em CameraFragment.kt . você pode ver o código A. Acho que a função pode ampliar uma imagem a qualquer momento.

Acho que uma imagem pode ser zoom in quando eu invocá-lo com sa pequeno valor, como zoomX(2f), zoomX(3f), mas a imagem não será zoom in novamente quando eu uso um grande valor, 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)      
    }
HelloCW
fonte
Você pode usar CameraControl.setZoomPercentage()fromandroidx.camera.camera-core:1.0.0-alpha01
sonnet
Obrigado! você poderia me mostrar mais detalhes CameraControl.setZoomPercentage()? Não consigo encontrar mais documentos e códigos de amostra.
HelloCW
Eu estava errado. Está no alpha07qual ainda não foi lançado. android.googlesource.com/platform/frameworks/support/+/… A versão mais recente éalpha06
soneto

Respostas:

3

Isto não é uma questão de tradição, mas de Futures. A atualização desse exemplo de CameraXBasic de 1.0.0-alpha06para 1.0.0-alpha08quebra muito, mas o CameraX CameraControl apresenta esses dois métodos:

Define o zoom atual por um valor de zoom linear que varia de 0fa 1.0f.

linearZoom 0frepresenta o zoom mínimo enquanto linearZoom 1.0frepresenta o zoom máximo. A vantagem linearZoomé que ele garante que o campo de visão (FOV) varie linearmente com o linearZoomvalor, para uso com elementos da interface deslizante da interface do usuário (enquanto setZoomRatio(float)funciona bem para gestos de pinch-zoom).

Define o zoom atual por proporção.

Ele modifica os atuais zoomRatioe, linearZoomportanto, se os aplicativos estiverem observando zoomRatioou linearZoom, eles receberão a atualização também. Se a proporção for menor CameraInfo.getMinZoomRatio()ou maior que CameraInfo.getMaxZoomRatio(), a devolução ListenableFuturefalhará IllegalArgumentExceptione não modificará a taxa de zoom atual. É dever das aplicações fixar a proporção.

Veja também Executor e também há CameraXExecutors.


Veja também as notas de versão ou as confirmações ... para todas as alterações na API, que quebram o exemplo CameraXBasic. Não explicarei mais essas diferenças de API (já que essa não era a questão), mas a bifurquei ; consulte as edições # 131 (até agora, pelo menos a visualização funciona lá).


É assim que realmente funciona:

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

Proporções de zoom de 1.0faté o 8.0ftrabalho no meu 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
fonte
Muito obrigado! Você poderia mostrar um código de amostra completo? para que eu possa executar e testá-lo.
HelloCW 30/12/19
BTW, o projeto CameraXBasic não pode ser executado depois que eu atualizo de 1.0.0-alpha06 para 1.0.0-alpha08.
HelloCW 30/12/19
Obrigado! Parece que a fusão ainda não foi concluída, então não posso instalá-la no meu PC para testar. Você poderia me dar uma bifurcação temporária para obter código e testar?
HelloCW 30/12/19
BTW, eu sou iniciante no GitHub, não sei como extrair do github.com/android/camera-samples/compare/…
HelloCW
No momento, eu só posso puxar o garfo caren / tap_to_focus, mas ele é baseado em "1.0.0-alpha05"
HelloCW
0

É uma tradição do Android, o nível de zoom existe entre 0e 1como muitos outros valores.

0 significa o menor nível de zoom.

1 significa o nível máximo de zoom.

É um valor flutuante para que você aumentá-lo como 0.1, 0.2, 0.9e assim por diante.

Ibrahim Ali
fonte
0

Primeiro de tudo, descubra o valor máximo de zoom da câmera - usando o getMaxZoom()método.

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

Se você usou a Visualização da câmera, pode definir o zoom na Visualização da câmera usando Rect. Como abaixo -

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

Você pode obter mais detalhes aqui - Zoom de visualização da câmera Android usando o toque duplo do dedo

Al-Amin
fonte
Obrigado! mas o CameraX não suporta getMaxZoom ().
HelloCW 26/11/19