iphone objective-c ipad uiimageview orientation

iphone - Guardar UIImage, cargarlo en orientación incorrecta



objective-c ipad (5)

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

Estoy usando el siguiente código para guardar y cargar imágenes que elijo de la biblioteca o tomo usando la cámara:

//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 configuro la imagen elegida para que se muestre en mi UIImageView :

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

Sin embargo, cuando selecciono, UIImageView imagen y la configuro para que se muestre en mi UIImageView , está bien, pero cuando cargo esa imagen, a menudo tiene la orientación incorrecta. ¿Algunas ideas? ¿Alguien experimentó esto o sabe cómo puedo resolver esto?

Gracias.

EDITAR:

Por lo tanto, parece que si carga una fotografía en la que se tomó una fotografía con el retrato boca abajo, se carga en esa orientación; si toma una fotografía en el paisaje izquierdo, se carga en esa orientación. ¿Alguna idea de cómo evitar esto? Cualquiera sea la orientación que carguen, siempre regresan como UIImageOrientationUp.


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


Me he enfrentado a un problema similar y así es como lo resolví.

Mientras guardamos la imagen, debemos guardar su información de orientación junto con la imagen ...

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

Y cargamos la imagen, necesitamos leer su información de orientación y aplicarla 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 lo que necesitamos.

Gracias,


Puede usar Image I / O para guardar una imagen 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 en la 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 la categoría UIImage .

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

Alternativamente, puede guardar la imagen en NSMutableData utilizando CGImageDestinationCreateWithData y pasar NSMutableData lugar de NSURL en CGImageDestinationCreateWithURL .


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

Este sitio web debe ayudarlo a comenzar.

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

(La aplicación que usaste para ver la foto debe tener esto incorporado, es por eso que ves la orientación correcta al abrir la foto)