Zoom-Kamera 2-Vorschau mit TextureView
ich habe ein Problem mit meiner Vorschau-Zoom für die Kamera 2-API. Ich bin mit einem TextureView.
Möchte ich nur zoom der Vorschau-Stream, der war, zeigte sich in den TextureView.
Möchte ich zum vergrößern Sie den Bereich, wo ich die Zoom-Geste.
Ich die SimpleOnScaleGestureListener!
Fügte ich folgenden Code. Die zoomingFactor und die x-und y-Position sind richtig.
private void updateTextureViewSize(float xPosi,float yPosi, float scale){
float scaleX = 1.0f;
float scaleY = 1.0f;
float mVideoWidth = mCamcontrol.getmPreviewSize().getWidth();
float mVideoHeight = mCamcontrol.getmPreviewSize().getHeight();
int rotation = getWindowManager().getDefaultDisplay().getRotation();
RectF viewRect = new RectF(0, 0, 1440, 2560);
RectF bufferRect = new RectF(0, 0, mVideoHeight, mVideoWidth);
bufferRect.offset(xPosi - bufferRect.centerX(), yPosi - bufferRect.centerY());
//16:9 faktor
scaleX = ((mScale * scale) / 9f) * 16f;
scaleY = ((mScale * scale) / 16f) * 9f;
Matrix matrix = new Matrix();
matrix.setRectToRect(bufferRect, viewRect, Matrix.ScaleToFit.FILL);
scalefactorView.setText(String.valueOf(xPosi) + " " + String.valueOf(yPosi));
matrix.setScale(scaleY, scaleX, xPosi, yPosi);
matrix.postRotate(90 * (rotation - 2), xPosi, yPosi);
mTextureView.setTransform(matrix);
}
Zoomen ist Recht, aber nicht die Position wo ich Zoomen. Zum Beispiel! Wenn ich zoom auf die position rechts/Mitte sehe ich nur die linke/Obere Rechteck des Baches.
Habe ich den folgenden Bilder zu verstehen das problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Android-Kamera2 api : Pinch Zoom In/Out
Verwenden Sie diese Beispiel-code für Camera2Basic von google-Entwicklern. https://github.com/googlesamples/android-Camera2Basic
Deklarieren nun zwei-Klassen-Variablen –
und aktualisieren Sie die gegebenen onTouch () - Methode.
Dank @arin 's Antwort, ich habe eine verbesserte version.
Sein code ist im Grunde arbeiten, aber es gibt 2 Probleme:
1) die Lesbarkeit - ich gar nicht wissen, was Los ist auf die Berechnung der
Rect zoom
2) In meinem Android 7.1.1 Gerät, in der Vorschau wird frieren, wenn der zoom zu groß ist, zu einem gewissen Grad. Da ich dieses problem mit den folgenden code, ich bin mir ziemlich sicher, dass es ist, weil der original-code erlaubt über-Zoomen hinaus-Kamera den maximalen zoom-Verhältnis.
(In der Tat, ich weiß nicht, warum er braucht, um zu gelten *10 dem Verhältnis zurückgegeben
CameraCharacteristics
)Hier sind meine codes: (ich mache das alles in meiner benutzerdefinierten
TextureView
, die auch speichert meine Kamera 2 Objekte und Ihre Logik:Zugehörigen Member-Variablen:
Rechts, nachdem Sie Sie erhalten
CameraCharacteristics
ausCameraManager
wahrscheinlich in einigen anfänglichen setup:überschreiben
onTouchEvent
:Und die
getFingerSpacing
Methode:Schließlich nicht vergessen, die Ernte-region, wenn Sie Sie tatsächlich nehmen Sie das Foto. Mein code ist auf Basis dieser Camera2Basic ich dazu in der
captureStillPicture()
Methode:@arin Antwort funktioniert danke @arin nur eine Sache, die zoom-Empfindlichkeit ist zu hoch.
Zur Steuerung dieses ich ein paar änderungen vornehmen, könnten Sie nützlich sein.
Ändern zoom_level Datentyp double
public int zoom_level = 1;
zupublic double zoom_level = 1;
Dann erhöhen Sie oder verringern zoom_level mit niedrigem Wert, die ich verwenden
0.4
Hier ist ein Schwenk-und Zoom-Objekt aus Kamera2, die ich gemacht habe, um die Arbeit mit der OnScaleGestureListener und SimpleOnGestureListener-onScroll-Ausgänge. Dies funktioniert nur wie erwartet, wenn Sie eine Kamera mit support-level > ERBE, als ERBE unterstützt nur crop-center.
Zwei Vorbehalte:
Einer ist, dass diese ist derzeit NICHT eingerichtet, um die Ausgabe auf JPEG-Ausgabe, die als Rechtecke für die JPEG-Ausgänge verfügen müssen, die Abmessungen sind Vielfache von 16 (Siehe warum hier). Das zweite ist, dass ich gesperrt, mein Bildschirm auf Querformat, und meine Kamera ist gesperrt, auch der Landschaft, aber es sollte möglich sein, Angebot mit Bildschirm Rotationen nach ein paar tweaks.
Werden Sie brauchen, um passieren in den Bildschirm Abmessungen
die Maximale Kamera-Digitalzoom
den Kamera-Sensor das Aktive Array-Größe
Hier ist mein Objekt-Initialisierung
den CamScaler Klasse
Und wie es zu benutzen
Die Eingaben für diese Funktionen sind direkt weitergegeben durch der Geste-Listener
Ich hoffe, das jemand hilft!
Neben arin Antwort,hinzufügen Müssen
captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom);
Zu captureStillPicture () - Methode lassen Sie zoom-wirksam erfassen