Warum kann CameraX ein Bild nicht so vergrößern, wie ich es in Android Studio benötige?

8

Ich lerne CameraX und CameraXBasic ist ein Beispielcode.

Ich schreibe eine zoomX-Funktion basierend auf CameraFragment.kt . Sie können den Code A sehen. Ich denke, die Funktion kann ein Bild jederzeit vergrößern.

Ich finde , dass ein Bild mit sa kleinen Wert , wenn ich invoke es seinen Zoom kann, wie zum Beispiel zoomX(2f), zoomX(3f)aber das Bild wird nicht wieder seinen Zoom , wenn ich einen großen Wert wie verwenden zoomX(6.0f), zoomX(7.0f)... warum?

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)      
    }
HalloCW
quelle
Sie können CameraControl.setZoomPercentage()vonandroidx.camera.camera-core:1.0.0-alpha01
Sonett
Vielen Dank! Würden Sie mir bitte weitere Details zeigen CameraControl.setZoomPercentage()? Ich kann keinen weiteren Dokument- und Beispielcode finden.
HelloCW
Ich lag falsch. Es ist in alpha07dem noch nicht veröffentlicht ist. android.googlesource.com/platform/frameworks/support/+/… Die neueste Version istalpha06
Sonett

Antworten:

3

Dies ist keine Frage der Tradition, sondern von Futures. Das Aktualisieren dieses CameraXBasic- Beispiels von 1.0.0-alpha06auf 1.0.0-alpha08bricht viel ab, aber CameraX CameraControl bietet diese beiden Methoden:

Legt den aktuellen Zoom um einen linearen Zoomwert von 0fbis fest 1.0f.

linearZoom 0fstellt den minimalen Zoom dar, während linearZoom 1.0fer den maximalen Zoom darstellt. Der Vorteil von linearZoomist, dass das Sichtfeld (FOV) linear mit dem linearZoomWert variiert , um es mit Schieberegler-UI-Elementen zu verwenden (während es sich setZoomRatio(float)gut für Pinch-Zoom-Gesten eignet).

Legt den aktuellen Zoom nach Verhältnis fest.

Es ändert sowohl Strom zoomRatiound linearZoomso , wenn apps beobachten zoomRatiooder linearZoomwerden sie das Update auch bekommen. Wenn das Verhältnis kleiner CameraInfo.getMinZoomRatio()oder größer als ist CameraInfo.getMaxZoomRatio(), ListenableFutureschlägt die Rückgabe mit fehl IllegalArgumentExceptionund das aktuelle Zoomverhältnis wird nicht geändert. Es ist die Pflicht der Anwendungen, das Verhältnis zu klemmen.

Siehe auch Executor und es gibt auch CameraXExecutors.


Siehe auch die Release Notes oder die Commits ... für alle die API - Änderungen, die das CameraXBasic Beispiel brechen. Ich werde diese API-Unterschiede nicht mehr erklären (da dies nicht die Frage war), habe sie aber gegabelt . siehe Ausgabe Nr. 131 (bisher funktioniert dort zumindest die Vorschau).


So funktioniert es tatsächlich:

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

Zoomverhältnisse von 1.0fbis zur 8.0fArbeit an meinem 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
quelle
Vielen Dank! Könnten Sie einen vollständigen Beispielcode anzeigen? damit ich es laufen und testen kann.
HelloCW
Übrigens kann das Projekt CameraXBasic nicht ausgeführt werden, nachdem ich es von 1.0.0-alpha06 auf 1.0.0-alpha08 aktualisiert habe.
HelloCW
Vielen Dank! Es scheint, dass die Zusammenführung noch nicht abgeschlossen ist, sodass ich sie zum Testen nicht auf meinen PC ziehen kann. Könnten Sie mir eine temporäre Gabel geben, um Code zu ziehen und zu testen?
HelloCW
Übrigens, ich bin ein Anfänger von GitHub, ich weiß nicht, wie ich von github.com/android/camera-samples/compare/…
HelloCW
Zur Zeit kann ich nur die Gabel caren / tap_to_focus ziehen, aber es basiert auf "1.0.0-alpha05"
HelloCW
0

Es ist eine Android-Tradition, Zoomstufen existieren zwischen 0und 1wie viele andere Werte.

0 bedeutet die niedrigste Zoomstufe.

1 bedeutet die maximale Zoomstufe.

Es ist ein Float - Wert , so dass Sie es wie erhöhen 0.1, 0.2, 0.9und so weiter.

Ibrahim Ali
quelle
0

Ermitteln Sie zunächst den maximalen Zoomwert der Kamera mithilfe der getMaxZoom()Methode.

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

Wenn Sie die Kameravorschau verwendet haben, können Sie den Zoom in der Kameravorschau mithilfe von einstellen Rect. Wie unten -

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

Weitere Informationen erhalten Sie hier - Vorschau-Zoom für Android-Kameras mit Doppelfinger-Berührung

Al-Amin
quelle
Vielen Dank! CameraX unterstützt getMaxZoom () jedoch nicht.
HelloCW