Wie geht Android mit Unterschieden zwischen Vorschaugröße / -verhältnis und tatsächlicher SurfaceView-Größe um?

8

Ich schreibe eine kleine Android-App, wo ein Benutzer ein Bild in die Live-Vorschau der Kamera platzieren und ein Foto davon machen kann. Die App wird dann die zwei Bilder passend kombinieren - All dies funktioniert gut.

Ich verstehe, dass Sie PreviewSize mit Camera.getParameters () erhalten / einstellen können, ich nehme an, dass dies mit der Größe des Echtzeit-Kamera Feeds zusammenhängt.

Die Größe meiner SurfaceView, in der die Kameravorschau angezeigt wird, unterscheidet sich jedoch von den gemeldeten (und verwendeten) PreviewSizes. Im Emulator ist mein verfügbares SurfaceView zum Beispiel 360x215, während PreviewSize 320x240 ist. Dennoch ist die gesamte Oberfläche mit der Vorschau gefüllt.

Aber das Bild, das am Ende erzeugt wird, ist (auch?) 320x240. Wie kompensiert Android diese Unterschiede in Größe und Seitenverhältnis? Ist das Bild abgeschnitten?

Oder missverstehe ich einfach, worum es bei PreviewSize geht - hängt das mit der Größe der generierten Bilder zusammen oder hängt es mit der "Echtzeitvorschau" zusammen, die auf der SurfaceView projiziert wird? Gibt es nicht-triviale Kamera-Beispiele, die sich damit beschäftigen?

Ich muss wissen, wie die Transformation stattfindet, um schließlich das Bild korrekt in das Foto zu kopieren / skalieren, daher diese Fragen.

    
Ivo van der Wijk 09.01.2012, 21:05
quelle

1 Antwort

1

Ich versuche das selbst herauszufinden. Hier ist, was ich bis jetzt herausgefunden habe.

  • Die Oberflächenansicht hat eine interne Oberfläche namens mSurface , die tatsächlich als Kameravorschub und Encoder-Feed verwendet wird. Dieser Puffer muss also die tatsächliche Größe sein, in der die Aufzeichnung erfolgen soll.
  • Sie können die Größe dieses mSurface unabhängig von SurfaceView festlegen, indem Sie die Methode setFixedSize
  • verwenden
  • Nun möchten Sie vielleicht eine HD-Aufnahme machen, so dass die mSurface eine Auflösung von 1280x760 benötigt, aber Sie SurfaceView können nicht so groß sein (vorausgesetzt, Sie laufen auf einem Telefon mit einem WVGA-Bildschirm). Sie versuchen also, eine kleinere Auflösung als 1280 x 760 zu wählen, die auch das gleiche Seitenverhältnis beibehält.
  • Android führt nun eine Größenanpassung für den HD-Puffer durch, um die Vorschauauflösung zu erhalten, das Beschneiden ist nicht erfolgt, es wird nur auf die SurfaceView reoslutions
  • skaliert
  • An diesem Punkt haben also sowohl die mSurface als auch die previewSize , die Sie für die Kamera eingestellt haben, die gleiche Auflösung und daher hat die resultierende Videoaufnahme auch die gleiche Auflösung.

Davon abgesehen kämpfe ich immer noch darum, dass mein VGA-Rekorder auf Nexus S funktioniert, er arbeitet an einem LG Maha-Gerät. :)

    
bluefalcon 12.01.2012 06:19
quelle