2012-01-12 16 views
15

I corrente dispone di un'app che utilizza ALAsssetsLibrary per recuperare le foto. Ho inserito la foto in una vista immagine e sono in grado di caricare sul server. Quando ho provato il dispositivo reale dopo aver scattato alcune foto, ho scoperto che le foto che si supponeva fossero scattate in Portrait diventassero un paesaggio.L'orientamento non si comporta correttamente con Photo in ALAsset

Pertanto, ho chiamato funzione differente per ottenere il CGImage simili:

UIImage *image = [UIImage imageWithCGImage:[representation fullResolutionImage] scale:1.0 orientation:(UIImageOrientation)[representation orientation]]; 

La prima provato, ho usato questo:

UIImage *image = [UIImage imageWithCGImage:[representation fullResolutionImage]] 

ho pensato quello con dimensioni e orientamento potrebbe dare ho il giusto orientamento che la foto è stata scattata. Ma non mi ha dato la soluzione giusta.

Mi manca tutto ciò che è necessario per generare un orientamento corretto della foto?

+1

questo problema si verifica con le foto scattate dal dispositivo – Leena

risposta

44

La corretta gestione dell'orientamento dipende dalla versione di iOS che si sta utilizzando. Su iOS4 e iOS 5 la miniatura è già ruotata correttamente, quindi è possibile inizializzare la UIImage senza specificare alcun parametro di rotazione. Tuttavia per il fullScreenImage, il comportamento è diverso per ogni versione di iOS. Su iOS 5 l'immagine è già stata ruotata su iOS 4 non.

Così l'iOS4 si dovrebbe usare:

ALAssetRepresentation *defaultRep = [asset defaultRepresentation]; 
UIImage *_image = [UIImage imageWithCGImage:[defaultRep fullScreenImage] 
                scale:[defaultRep scale] orientation:(UIImageOrientation)[defaultRep orientation]]; 

Su iOS5 il seguente codice dovrebbe funzionare correttamente:

ALAssetRepresentation *defaultRep = [asset defaultRepresentation]; 
UIImage *_image = [UIImage imageWithCGImage:[defaultRep fullScreenImage] scale:[defaultRep scale] orientation:0]; 

Cheers,

Hendrik

+0

Nel mio caso avevo bisogno di fullResolutionImage e ho testato su iOS 6 e 7. L'immagine non è stata ruotata automaticamente ma il primo codice di esempio fa il trucco! Grazie amico! P.S. fare attenzione se si salva l'immagine sul file con i metadati. Se hai ruotato l'immagine, devi impostare l'orientamento EXIF ​​su 0 per evitare strani jpeg ruotati;) – Primoz990

+0

Devo correggere il mio commento. Il primo esempio di codice non ha ruotato la mia immagine fullResolution, ho dovuto ruotarlo da solo. Accetto però che fullScreenImage venga automaticamente ruotato su iOS 6 e 7. – Primoz990

+0

Great! Funziona anche per me con iOS 7! Molte grazie ! – Vinestro

4

provare questo codice: -

UIImage* img = [UIImage imageWithCGImage:asset.thumbnail]; 
img = [UIImage imageWithCGImage:img.CGImage scale:1.0 orientation:UIImageOrientationUp]; 

questo può aiutare.

+0

Non riesco a provarlo ora poiché non possiedo il dispositivo. Ti dispiace spiegarmi quelle due righe di codice? L'img sulla prima riga è la miniatura dell'asset ma non l'immagine reale. – LittleFunny

+0

Ho usato la miniatura dell'immagine e ho mantenuto l'orientamento dell'immagine verso l'alto in modo che non venga ruotato e ha funzionato nel mio caso. – Leena

+0

Forse ho un altro problema ... Ma grazie per l'aiuto – LittleFunny

3

La mia esperienza è limitata a IOS 5.x ma posso dirti che la miniatura e le immagini a schermo intero sono orientate pro Perly. È la ripresa completa che è orizzontale quando viene girata verticalmente. La mia soluzione è quella di utilizzare una categoria a UIImage che ho ottenuto da qui:

http://www.catamount.com/forums/viewtopic.php?f=21&t=967&start=0

Esso fornisce un buon metodo di rotazione su un UIImage come questo:

 UIImage *tmp = [UIImage imageWithCGImage:startingFullResolutionImage]; 
     startingFullResolutionImage = [[tmp imageRotatedByDegrees:-90.0f] CGImage]; 
+0

Ho appena usato la risoluzione completa e ha funzionato per me. Grazie. – Ali

0

Per fullResolutionImage, mi piacerebbe per fornire una soluzione come segue,

ALAssetRepresentation *rep = [asset defaultRepresentation]; 

// First, write orientation to UIImage, i.e., EXIF message. 
UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage] scale:rep.scale orientation:(UIImageOrientation)rep.orientation]; 
// Second, fix orientation, and drop out EXIF 
if (image.imageOrientation != UIImageOrientationUp) { 
    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); 
    [image drawInRect:(CGRect){0, 0, image.size}]; 
    UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    image = normalizedImage; 
} 
// Third, compression 
NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 

imageData è ciò che si vuole, e solo caricarlo sul server di foto.

A proposito, se pensi che EXIF ​​sia utile, puoi completarlo a normalizedImage come desideri.

Problemi correlati