Warum führen AVCaptureVideoOrientation-Landschaftsmodi zu verdrehten Standbildern?

7

Ich verwende AVFoundation-Klassen, um eine benutzerdefinierte Kamera in meiner App zu implementieren. Ich nehme nur Standbilder auf, nicht Video. Ich habe alles in Ordnung, bin aber von etwas überrascht. Ich berücksichtige die Geräteausrichtung, wenn ein Standbild aufgenommen wird, und stelle die Videoausrichtung der Videoverbindung entsprechend ein. Ein Code-Snippet:

%Vor%

Beachten Sie meine Kommentare in den Landschaftsfällen. Ich muss das Orientierungsmapping umkehren oder das resultierende Bild steht auf dem Kopf. Ich erfasse und speichere das Bild mit dem folgenden Code:

%Vor%

Es gibt keine andere Bildverarbeitung oder Manipulation.

Meine App funktioniert mit dem obigen Code. Ich versuche nur zu verstehen, warum die Orientierungskonstanten für Querformat-Orientierungen umgekehrt werden müssen. Danke!

    
XJones 21.10.2011, 06:00
quelle

3 Antworten

20

Heh, es scheint, dass niemand Lust hatte, hier mitzuspielen. Stellt sich heraus, die Antwort ist einfach. Bilder, die mit der Methode stillImageOutput captureStillImageAsynchronouslyFromConnection:... erfasst werden, haben immer die folgenden Eigenschaften:

  • UIImage orientation = immer UIImageOrientationRight unabhängig von der Geräteausrichtung
  • UIIMagnetgröße = B x H (z. B. Hochformat x Hochformat, hängt von Ihrer Kameraauflösung ab)
  • CGImage size = hängt von der Geräteausrichtung ab (z. B. Hoch- oder Querformat)

Die Lösung zum Drehen des Bildes besteht also darin, die Geräteausrichtung in Verbindung mit der CGImage-Größe zu verwenden, um eine geeignete affine Transformation anzuwenden. Da ich meine eigene Frage beantworte, bin ich nicht die Lösung im Code, aber ich habe am Ende eine Routine geschrieben:

%Vor%

in einer UIImage-Kategorie mit verschiedenen Bildverarbeitungsverbesserungen.

EDIT - Implementierungsbeispiel

Ich habe eine Reihe von Anfragen für Funktionscode erhalten. Ich habe die relevante Implementierung aus einer funktionierenden App extrahiert.

%Vor%     
XJones 28.10.2011, 17:25
quelle
6

Warum Sie AVCaptureVideoOrientationLandscape Richtig brauchen, wenn die Ausrichtung des Geräts UIDeviceOrientationLandscape Left lautet, liegt das daran, dass UIDeviceOrientationLandscape Left == UIInterfaceOrientationLandscape Richtig und die AVCaptureVideoOrientations folgen der UIInterfaceOrientation-Konvention.

Außerdem enthält UIDeviceOrientation andere Optionen wie UIDeviceOrientationFaceUp, UIDeviceOrientationFaceDown und UIDeviceOrientationUnknown. Wenn Sie Ihre Benutzeroberfläche drehen lassen, um sie an die Ausrichtung des Geräts anzupassen, können Sie versuchen, die UIDeviceOrientation stattdessen von [UIApplication sharedApplication] .statusBarOrientation abzurufen.

    
JiBB 28.02.2012 23:34
quelle
0

Tatsächlich gibt es keinen Fehler in Ihrer Implementierung und Sie können den gesamten Switch-Fall eliminieren.

Warum die Groß- und Kleinschreibung vermieden werden kann:

Die entsprechenden Werte der Geräte- und Videoausrichtungen sind numerisch gleich, d. h. solange die Geräteausrichtung nicht unbekannt ist, können Sie UIDeviceOrientation und AVCaptureVideoOrientation

gleichsetzen

Über die verwirrende Nomenklatur:

Geräteausrichtung LandscapeLeft = & gt; Die Oberseite Ihres Telefons befindet sich auf der linken Seite.

Stellen Sie sich also vor, wo der Ausgangspunkt des Videos ist ..... das ist richtig, TOP RIGHT corner = & gt; Landschaft rechts.

Auch in der anderen Querformatausrichtung ist die Videoausrichtung von der Oberseite des Telefons entfernt. Dies ist nicht verwirrend im Falle eines Portraits und auf dem Kopf stehend

Beweis

Wenn Sie ein Standbild aufnehmen, überprüfen Sie den EXIF-Wert für die Ausrichtung. Für die linke Landschaft ist die EXIF-Ausrichtung 3 (180 Grad Inversion) Für Querformat rechts ist die EXIF-Ausrichtung 1 (keine Drehung)

Wenn Sie anzeigen, wird Ihre Exif-Ausrichtung in die entsprechende UIImageOrientation konvertiert, so dass es keine Inversion geben sollte.

Im Fall der Frontkamera habe ich bemerkt, dass EXIF-Werte einfach den Video-Orientierungswerten folgen (Spiegeleffekt wird nicht beachtet). Es werden nur 1, 3, 6, 8 Werte von EXIF ​​verwendet.

Auch der Spiegel ist immer entlang der Linie von der Oberseite des Geräts nach unten Die Landschaft wird also auf den Kopf gestellt, während das Porträt und das umgedrehte Porträt nur gespiegelt sind.

    
Shravya Boggarapu 30.09.2016 15:02
quelle