2011-10-20 10 views
32

estoy usando el siguiente código para guardar y cargar las imágenes que escoger de cualquiera de la biblioteca o tomar el uso de la cámara:Guardar UIImage, cargarlo en una orientación incorrecta

//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]; 
} 

Así es como me puse la imagen captada que se muestra en mi UIImageView:

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

sin embargo, cuando cojo y la imagen y fijarlo como se muestra en mi UIImageView que está muy bien, pero cuando me carga esa imagen es a menudo la orientación equivocada. ¿Algunas ideas? ¿Alguien experimentó esto o sabe cómo puedo resolver esto?

Gracias.

EDIT:

Por lo que parece, si se carga una foto que fue tomada una foto en el retrato al revés, se carga en la que la orientación, si se toma una foto en el paisaje dejó que se carga en esa orientación. ¿Alguna idea de cómo evitar esto? Cualquiera sea la orientación que carguen, siempre regresan como UIImageOrientationUp.

+0

Basta con mirar UIImageOrientationUp para los documentos de UIImage. puede establecer la propiedad para imageOrientation del objeto UIImage. –

+0

¿Cómo puedo aplicar esta orientación? He echado un vistazo y parece ser solo para comparaciones y la rotación debe hacerse manualmente. –

+0

Por favor revisa mi edición. –

Respuesta

25

me he enfrentado a un problema similar y aquí es cómo resolví eso.

Mientras que guardar la imagen tenemos que guardar su información de orientación junto con la imagen ...

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

Y carga de la imagen que necesitamos lea los datos de orientación y aplicarlo a la imagen ...

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

orientedImage es WH en lo que necesitamos

Gracias,

+0

¿Funciona esto incluso después de que el UIImage se haya convertido a NSData y viceversa? – zakdances

+0

Gracias, estaba teniendo problemas con rotaciones extrañas durante 6 horas cuando finalmente encontré esta respuesta. –

+1

Esto resolvió mi problema, pero solo una vez comencé a usar el atributo de orientación ALAsset en lugar del atributo de orientación UIImage. –

0

Intente también guardar la orientación de la imagen, luego cuando cargue esa imagen, verifique si esa es la orientación correcta, y si no, gire la imagen con CGAffineTransform o lo que desee.

3

Compruebe la información EXIF ​​para la imagen que está cargando, debe haber una etiqueta de orientación. Use el valor para rotar su imagen a la orientación correcta.

Este sitio web debe comenzar.

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

(La aplicación utilizada para ver la foto debe tener esta construido en, por eso se ve orientación correcta cuando se abre la foto)

+1

Ahh muy interesante, sin embargo, ¿cómo voy a ir a buscar los datos de orientación exif? –

47

La causa principal es el formato PNG no tiene información de orientación de la imagen, pero el formato JPEG no. Entonces, la forma más fácil de resolver este problema es guardar su archivo en formato JPEG usando UIImageJPEGRepresentation()

+0

Esto ha solucionado mi problema con las imágenes guardadas que no regresan en la orientación correcta, especialmente las tomadas de la cámara. El único inconveniente de usar la alternativa JPEG es que la transparencia no se conserva, ¿correcto? – micnguyen

1

Puede usar Image I/O para guardar imágenes PNG en un archivo (o NSMutableData) con respecto a la orientación de la imagen original. En el siguiente ejemplo, guardo la imagen PNG en un archivo al 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: es un método de UIImage categoría.

+ (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; 
} 

Puede guardar la imagen como alternativa al uso de NSMutableDataCGImageDestinationCreateWithData y pasar NSMutableData en lugar de NSURL en CGImageDestinationCreateWithURL.

Cuestiones relacionadas