2011-10-20 13 views
32

Sto usando il seguente codice per salvare e caricare le immagini che io scelgo sia dalla libreria o prendere l'utilizzo della fotocamera:Salva UIImage, caricarlo nella direzione errata

//saving an image 
- (void)saveImage:(UIImage*)image:(NSString*)imageName { 
    NSData *imageData = UIImagePNGRepresentation(image); //convert image into .png format. 
    NSFileManager *fileManager = [NSFileManager defaultManager];//create instance of NSFileManager 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //create an array and store result of our search for the documents directory in it 
    NSString *documentsDirectory = [paths objectAtIndex:0]; //create NSString object, that holds our exact path to the documents directory 
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", imageName]]; //add our image to the path 
    [fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; //finally save the path (image) 
    NSLog(@"image saved"); 
} 

//loading an image 
- (UIImage*)loadImage:(NSString*)imageName { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", imageName]]; 
    return [UIImage imageWithContentsOfFile:fullPath]; 
} 

Ecco come ho impostato l'immagine raccolta per essere mostrato nel mio UIImageView:

imgView.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 

Tuttavia, quando prendo in mano e l'immagine e impostarlo per essere mostrato nel mio UIImageView va bene, ma quando carico quell'immagine è spesso l'orientamento errato. Qualche idea? Qualcuno ha provato questo o sa come posso risolvere questo?

Grazie.

EDIT:

Così sembra, se si carica una foto che è stata presa una foto in verticale a testa in giù, viene caricato in questa posizione, se si scatta una foto in un paesaggio rimasto carica in questa posizione. Qualche idea su come aggirare questo? Qualunque orientamento essi caricano, restituiscono sempre come UIImageOrientationUp.

+0

Basta guardare UIImageOrientationUp per i documenti UIImage. è possibile impostare la proprietà per imageOrientation dell'oggetto UIImage. –

+0

Come posso applicare questo orientamento? Ho dato un'occhiata e sembra che sia solo per i confronti e la rotazione deve essere fatta manualmente. –

+0

Si prega di controllare la mia modifica. –

risposta

25

ho affrontato problemi simili ed ecco come ho risolto esso.

Mentre noi salvare l'immagine abbiamo bisogno di salvare le sue informazioni di orientamento insieme all'immagine ...

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
[userDefaults setInteger:[myImage imageOrientation] forKey:@"kImageOrientation"]; 
[imageOrientation release]; 

E noi Load Image dobbiamo leggere le informazioni di orientamento e applicarlo all'immagine ...

UIImage *tempImage = [[UIImage alloc] initWithContentsOfFile:fullPath]; 
UIImage *orientedImage= [[UIImage alloc] initWithCGImage: tempImage.CGImage scale:1.0 orientation:imageOrientation]; 
[tempImage release]; 

orientedImage è wh abbiamo bisogno

Grazie,

+0

Funziona anche dopo che UIImage è stato convertito in NSData e nuovamente? – zakdances

+0

Grazie, ho avuto problemi con strane rotazioni per 6 ore quando ho finalmente trovato questa risposta. –

+1

Questo ha risolto il problema, ma solo una volta ho iniziato a utilizzare l'attributo di orientamento ALAsset anziché l'attributo di orientamento UIImage. –

0

Cerca di salvare anche l'orientamento dell'immagine, quindi quando carichi quell'immagine, controlla se l'orientamento è corretto e, in caso contrario, ruota l'immagine con CGAffineTransform o quello che vuoi.

3

Controllare le informazioni EXIF ​​per l'immagine che si sta caricando, ci dovrebbe essere un tag per l'orientamento. Usa il valore per ruotare l'immagine con l'orientamento corretto.

Questo sito web dovrebbe iniziare.

http://www.impulseadventure.com/photo/exif-orientation.html

(L'applicazione utilizzata per visualizzare la foto deve avere questo integrato, è per questo che si vede corretto orientamento quando si apre la foto)

+1

Ahh molto interessante, tuttavia come farei a recuperare i dati di orientamento exif? –

47

La causa principale è PNG non ha informazioni di orientamento immagine, ma il formato JPEG fa. Quindi il modo più semplice per risolvere questo problema è salvare il file in formato JPEG usando UIImageJPEGRepresentation()

+0

Questo ha risolto il mio problema con le mie immagini salvate che non tornavano con l'orientamento corretto, specialmente quelle riprese dalla fotocamera. L'unico inconveniente derivante dall'utilizzo dell'alternativa JPEG è che la trasparenza non viene mantenuta, corretta? – micnguyen

1

È possibile utilizzare I/O immagine per salvare l'immagine PNG su file (o NSMutableData) rispetto all'orientamento dell'immagine originale. Nell'esempio seguente, salverò l'immagine PNG in un file allo path.

- (BOOL)savePngFile:(UIImage *)image toPath:(NSString *)path { 
    NSData *data = UIImagePNGRepresentation(image); 
    int exifOrientation = [UIImage cc_iOSOrientationToExifOrientation:image.imageOrientation]; 
    NSDictionary *metadata = @{(__bridge id)kCGImagePropertyOrientation:@(exifOrientation)}; 
    NSURL *url = [NSURL fileURLWithPath:path]; 
    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL); 
    if (!source) { 
     return NO; 
    } 
    CFStringRef UTI = CGImageSourceGetType(source); 
    CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, UTI, 1, NULL); 
    if (!destination) { 
     CFRelease(source); 
     return NO; 
    } 
    CGImageDestinationAddImageFromSource(destination, source, 0, (__bridge CFDictionaryRef)metadata); 
    BOOL success = CGImageDestinationFinalize(destination); 
    CFRelease(destination); 
    CFRelease(source); 
    return success; 
} 

cc_iOSOrientationToExifOrientation: è un metodo di UIImage categoria.

+ (int)cc_iOSOrientationToExifOrientation:(UIImageOrientation)iOSOrientation { 
    int exifOrientation = -1; 
    switch (iOSOrientation) { 
     case UIImageOrientationUp: 
      exifOrientation = 1; 
      break; 

     case UIImageOrientationDown: 
      exifOrientation = 3; 
      break; 

     case UIImageOrientationLeft: 
      exifOrientation = 8; 
      break; 

     case UIImageOrientationRight: 
      exifOrientation = 6; 
      break; 

     case UIImageOrientationUpMirrored: 
      exifOrientation = 2; 
      break; 

     case UIImageOrientationDownMirrored: 
      exifOrientation = 4; 
      break; 

     case UIImageOrientationLeftMirrored: 
      exifOrientation = 5; 
      break; 

     case UIImageOrientationRightMirrored: 
      exifOrientation = 7; 
      break; 

     default: 
      exifOrientation = -1; 
    } 
    return exifOrientation; 
} 

È possibile in alternativa, salvare l'immagine utilizzando NSMutableDataCGImageDestinationCreateWithData e superare NSMutableData invece di NSURL in CGImageDestinationCreateWithURL.

Problemi correlati