2013-07-02 11 views
6

Ich benutze Code ähnlich wie in diesem Blog http://blog.logichigh.com/2008/06/05/uiimage-fix/ zu finden, um die Bilder zu drehen, nachdem ich sie mit der iPhone-Kamera genommen habe. Ich benutze AVFoundation.UIImage Orientierung, wenn iPhone auf Z-Achse ist

Ich habe den entsprechenden Code hier extrahiert:

case UIImageOrientationUp: //EXIF = 1 
     transform = CGAffineTransformIdentity; 
     break; 

    case UIImageOrientationUpMirrored: //EXIF = 2 
     transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); 
     transform = CGAffineTransformScale(transform, -1.0, 1.0); 
     break; 

    case UIImageOrientationDown: //EXIF = 3 
     transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); 
     transform = CGAffineTransformRotate(transform, M_PI); 
     break; 

    case UIImageOrientationDownMirrored: //EXIF = 4 
     transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); 
     transform = CGAffineTransformScale(transform, 1.0, -1.0); 
     break; 

    case UIImageOrientationLeftMirrored: //EXIF = 5 
     boundHeight = bounds.size.height; 
     bounds.size.height = bounds.size.width; 
     bounds.size.width = boundHeight; 
     transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); 
     transform = CGAffineTransformScale(transform, -1.0, 1.0); 
     transform = CGAffineTransformRotate(transform, 3.0 * M_PI/2.0); 
     break; 

    case UIImageOrientationLeft: //EXIF = 6 
     boundHeight = bounds.size.height; 
     bounds.size.height = bounds.size.width; 
     bounds.size.width = boundHeight; 
     transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); 
     transform = CGAffineTransformRotate(transform, 3.0 * M_PI/2.0); 
     break; 

    case UIImageOrientationRightMirrored: //EXIF = 7 
     boundHeight = bounds.size.height; 
     bounds.size.height = bounds.size.width; 
     bounds.size.width = boundHeight; 
     transform = CGAffineTransformMakeScale(-1.0, 1.0); 
     transform = CGAffineTransformRotate(transform, M_PI/2.0); 
     break; 

    case UIImageOrientationRight: //EXIF = 8 
     boundHeight = bounds.size.height; 
     bounds.size.height = bounds.size.width; 
     bounds.size.width = boundHeight; 
     transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); 
     transform = CGAffineTransformRotate(transform, M_PI/2.0); 
     break; 

Dies funktioniert gut, wenn das Telefon auf der X oder Y Achse gehalten wird.

Allerdings, wenn ich das Telefon auf der Z Achse halte. Es zeigt immer, dass die UIImageEXIF = 2 hat.

Ich weiß, ich kann den Beschleunigungsmesser verwenden, um zu erkennen, wenn das Gerät auf der Z Achse ist. Ich bin jedoch nicht in der Lage, einen Pfad zu sehen, der mich dazu bringt, zwischen den Bildern zu unterscheiden, wenn sie mit dieser Markierung markiert werden, da sie immer noch EXIF = 2 haben.

, d. H. Es wird mir erlauben, zwischen Fotos zu unterscheiden, die auf dem Z aufgenommen wurden. Aber es erlaubt mir nicht, zwischen den Fotos selbst zu unterscheiden, z. Landscape1 (iPhone Home-Taste links, Portrait, Landscape2 (iPhone Home-Taste rechts) enter image description here

+0

Welche Version von IOS verwenden Sie? –

+0

Das Telefon, auf dem ich teste, hat iOS 6. –

+0

Könnte es möglich sein, dass Sie das Gyroskop verwenden müssen? –

Antwort

0

EXIF-Daten geben nur die XY-Ausrichtung an Es gibt keine EXIF-Daten, die Ihnen sagen, ob die Kamera nach oben oder unten zeigt . Sie können die Ausrichtung des Geräts zum Zeitpunkt greifen Sie das Bild erfassen.

[[UIDevice currentDevice] orientation] 

Dann brauchen Sie nur den Überblick über das Bild zu halten und seine nach oben/unten Ausrichtung getrennt von den EXIF-Daten Wenn Sie Speichern der Bilder in Ihrer App, eine einfache Datenbanktabelle oder sogar ein serialisiertes NSDictionary mit dem Bildnamen als Schlüssel und Hoch/Tief-Orientierung als Wert

0

Ich stieß auf ein ähnliches Problem. Ich positionierte Ansichten auf dem Bildschirm in bestimmten Positionen je nach Geräteausrichtung. Wo jedoch das Gerät flach lag, ohne offensichtlich im Quer- oder Hochformat zu sein, war die Ausrichtung von [[UIDevice currentDevice] Orientierung unzuverlässig. Am Ende habe ich das gelöst, indem ich [[[UIApplication] sharedApplication] statusBarOrientation] verwendet habe, die immer die aktuelle Ausrichtung zurückgibt, in der die Statusleiste auf dem Bildschirm dargestellt wird. Ich habe mehr Erfahrung in iOS Apps mit Xamarin mit C# also verzeih mir, wenn mein ObjectiveC ein wenig aus ist.

Verwandte Themen