2013-07-02 5 views
6

Sto usando un codice simile a quello trovato su questo blog http://blog.logichigh.com/2008/06/05/uiimage-fix/ per ruotare le immagini dopo averle scattate con la fotocamera dell'iPhone. Sto usando AVFoundation.UIImage Orientamento quando l'iPhone è sull'asse Z

ho estratto il relativo codice qui:

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; 

Questo funziona bene quando il telefono è tenuto sull'asse X o Y.

Tuttavia, quando tengo il telefono sull'asse Z. Mostra sempre che lo UIImage ha EXIF = 2.

So che posso usare l'accelerometro per dire quando il dispositivo è sull'asse Z. Tuttavia, non sono in grado di vedere un percorso che mi porterà a distinguere tra le immagini quando vengono scattate, con questo contrassegnato, poiché hanno ancora EXIF = 2.

cioè mi consentirà di distinguere tra le foto scattate sulla Z. Ma non mi consentirà di distinguere tra le foto stesse ad es. Landscape1 (pulsante Home di iPhone a sinistra, Portrait, Landscape2 (pulsante Home di iPhone a destra) enter image description here

+0

Quale versione di iOS stai usando? –

+0

Il telefono su cui sto eseguendo il test ha iOS 6. –

+0

Potrebbe essere possibile utilizzare il giroscopio? –

risposta

0

I dati EXIF ​​riportano solo l'orientamento XY. Non c'è nulla nei dati EXIF ​​che indica se la fotocamera era rivolta verso l'alto o verso il basso . È possibile prendere l'orientamento del dispositivo al momento di catturare l'immagine:.

[[UIDevice currentDevice] orientation] 

Poi avrete solo bisogno di tenere traccia delle immagini e la sua su/giù orientamento separato dai dati EXIF ​​Se sei memorizzando le immagini nella tua app, farebbe una semplice tabella di database, o anche un NSDictionary serializzato con il nome dell'immagine come chiave e l'orientamento su/giù come valore

0

Mi sono imbattuto in un problema simile. Stavo posizionando le visualizzazioni sullo schermo in determinate posizioni a seconda dell'orientamento del dispositivo. Tuttavia, laddove il dispositivo si trovasse in piano senza essere ovviamente in orizzontale o verticale, l'orientamento dall'orientamento [[UIDevice currentDevice] non era affidabile. Ho finito per risolvere questo problema utilizzando [[[UIApplication] sharedApplication] statusBarOrientation] che restituirà sempre l'orientamento corrente in cui la barra di stato viene presentata sullo schermo. Ho più esperienza nelle app iOS che usano Xamarin con C# quindi perdonami se il mio ObjectiveC è un po 'fuori.