2013-07-02 15 views
6

Używam kodu podobnego do tego na tym blogu http://blog.logichigh.com/2008/06/05/uiimage-fix/ , aby obracać obrazy po wykonaniu ich aparatem iPhone. Używam AVFoundation.UIImage Orientacja, gdy iPhone jest na osi Z

Mam ekstrakcji odpowiedni kod tutaj:

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; 

Działa to dobrze, gdy telefon jest utrzymywana na osi X lub Y.

Jednak, gdy trzymam telefon na osi Z. Zawsze pokazuje, że UIImage ma EXIF = 2.

Wiem, że mogę użyć przyspieszeniomierza, aby stwierdzić, kiedy urządzenie znajduje się na osi Z. Jednak nie widzę ścieżki, która doprowadzi mnie do rozróżnienia zdjęć zrobionych, z tym oznaczonym, ponieważ wszystkie one nadal mają EXIF = 2.

tj. Pozwoli mi to rozróżnić zdjęcia wykonane na Z. Ale nie pozwoli mi to na odróżnienie samych zdjęć, np. Pejzaż1 (Przycisk Home po lewej stronie, Portret, Pejzaż2 (przycisk Home po prawej) enter image description here

+0

Jaką wersję ios używasz? –

+0

Telefon, na którym testuję, ma iOS 6. –

+0

Czy możliwe jest użycie żyroskopu? –

Odpowiedz

0

Dane EXIF ​​zgłaszają tylko orientację XY W danych EXIF ​​nie ma informacji, które wskazywałyby, czy kamera była skierowana w górę czy w dół . można chwycić orientację urządzenia w momencie przechwytywania obrazu.

[[UIDevice currentDevice] orientation] 

Potem wystarczy śledzić obraz i jego w górę/w dół orientacja oddzielone od danych EXIF ​​Jeśli jesteś przechowywanie obrazów w twojej aplikacji, wystarczy prosta tabela bazy danych, lub nawet serializowany NSDictionary z nazwą obrazu jako kluczem i orientacją w górę/w dół jako wartością

0

Wpadłem na podobny problem. W niektórych pozycjach ustawiałem widoki na ekranie w zależności od orientacji urządzenia. Jednak w przypadku gdy urządzenie leżało płasko, nie będąc widocznie w krajobrazie lub w orientacji pionowej, orientacja z orientacji [[UIDevice currentDevice] była niewiarygodna. W końcu rozwiązałem to przez użycie [[[UIApplication] sharedApplication] statusBarOrientation], która zawsze zwróci aktualną orientację, w której na ekranie wyświetlany jest pasek stanu. Mam większe doświadczenie w aplikacjach na iOS przy użyciu Xamarin z C#, więc wybacz mi, jeśli mój ObjectiveC jest trochę nietypowy.