web-dev-qa-db-fra.com

Pourquoi CameraX ne peut-il pas zoomer sur une image aussi grande que celle dont j'ai besoin dans Android Studio?

J'apprends CameraX, et CameraXBasic est un exemple de code.

J'écris une fonction zoomX basée CameraFragment.kt . vous pouvez voir le code A. Je pense que la fonction peut zoomer sur une image à tout moment.

Je trouve qu'une image peut être agrandie lorsque je l'invoque avec une petite valeur sa, telle que zoomX(2f), zoomX(3f), mais l'image ne sera plus agrandie lorsque j'utiliserai un grand valeur telle que zoomX(6.0f), zoomX(7.0f)... pourquoi?

Code 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)      
    }
8
HelloCW

Ce n'est pas une question de tradition, mais de Futures. La mise à jour de cet exemple CameraXBasic de 1.0.0-alpha06 Vers 1.0.0-alpha08 Casse beaucoup, mais CameraX CameraControl propose ces deux méthodes:

Définit le zoom actuel par une valeur de zoom linéaire allant de 0f À 1.0f.

linearZoom 0f Représente le zoom minimum tandis que linearZoom 1.0f Représente le zoom maximum. L'avantage de linearZoom est qu'il garantit que le champ de vision (FOV) varie linéairement avec la valeur linearZoom, pour une utilisation avec des éléments d'interface utilisateur de curseur (tandis que setZoomRatio(float) fonctionne bien pour gestes de pincement).

Définit le zoom actuel par rapport.

Il modifie à la fois les zoomRatio et linearZoom actuels, donc si les applications observent zoomRatio ou linearZoom, elles obtiendront également la mise à jour. Si le rapport est inférieur à CameraInfo.getMinZoomRatio() ou supérieur à CameraInfo.getMaxZoomRatio(), le ListenableFuture renvoyé échouera avec IllegalArgumentException et ne modifiera pas le taux de zoom actuel . C'est le devoir des applications de restreindre le rapport.

Voir aussi Executor et il y a aussi CameraXExecutors .


Voir également les notes de version ou commits ... pour toutes les modifications de l'API, qui cassent l'exemple CameraXBasic. Je n'expliquerai plus ces différences API (puisque ce n'était pas la question), mais ont bifurqué it; voir problèmes # 131 (jusqu'à présent, au moins l'aperçu fonctionne là-bas).


Voici comment cela fonctionne réellement:

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

Les rapports de zoom de 1.0f Jusqu'à 8.0f Fonctionnent sur mon 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
3
Martin Zeitler

C'est une tradition Android, le niveau de zoom existe entre 0 et 1 comme beaucoup d'autres valeurs ..

0 signifie le niveau de zoom le plus bas.

1 signifie le niveau de zoom maximum.

C'est une valeur flottante donc vous l'augmentez comme 0.1, 0.2, 0.9 etc.

0
Ibrahim Ali

Tout d'abord, déterminez la valeur de zoom maximale de la caméra - en utilisant la méthode getMaxZoom().

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

Si vous avez utilisé l'aperçu de l'appareil photo, vous pouvez définir le zoom dans l'aperçu de l'appareil photo à l'aide de Rect. Comme ci-dessous -

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

Vous pouvez obtenir plus de détails à partir d'ici - Zoom de prévisualisation de la caméra Android en utilisant le toucher du double doigt

0
Al-Amin