Estoy usando el siguiente código para guardar y cargar imágenes que yo escoja, desde la biblioteca o tomar el uso de 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];
}

Esto es ¿cómo puedo configurar el recogido imagen a mostrar en mi UIImageView:

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

Sin embargo, cuando elijo una imagen y configurarlo para que se muestre en mi UIImageView está bien, pero cuando me carga esa imagen es a menudo la orientación equivocada. Alguna idea? Alguien experimentado esto o saber cómo puedo resolver esto?

Gracias.

EDICIÓN:

Por lo que parece, si usted carga una foto que fue tomada una foto en vertical boca abajo, se carga en esa orientación, si usted toma una foto en el paisaje de la izquierda se carga en esa orientación. Alguna idea de cómo solucionar esto? Sea cual sea la orientación de que la carga es siempre regresan como UIImageOrientationUp.

  • Basta con mirar a UIImageOrientationUp para la UIImage docs. puede establecer la propiedad para imageOrientation de UIImage objeto.
  • ¿Cómo puedo aplicar esta orientación, aunque? He echado un vistazo y parece ser sólo para las comparaciones y la rotación tiene que ser hecho manualmente.
  • Por favor revise mi edición.
  • Este problema se puede resolver de esta manera:[fijar la imagen orentation][1] [1]: stackoverflow.com/questions/13393909/…
InformationsquelleAutor Josh Kahane | 2011-10-20

5 Comentarios

  1. 27

    Me he enfrentado a un problema similar y he aquí cómo la resolvió.

    Mientras guardamos la imagen necesitamos 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 que necesitamos para leer su orientación, informació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,

    • Funciona incluso después de la UIImage ha sido convertida a NSData y volver?
    • Gracias, estaba teniendo problemas con extrañas rotaciones de 6 horas cuando por fin he encontrado esta respuesta.
    • Esta resuelto mi problema, pero sólo una vez que empecé a usar el ALAsset orientación atributo en lugar de la UIImage orientación atributo.
  2. 55

    La raíz de la causa es el formato PNG no tiene la información de orientación de la imagen, pero el formato JPEG no. La manera más fácil de resolver este problema es guardar el archivo en formato JPEG utilizando UIImageJPEGRepresentation()

    • Esto se ha resuelto mi problema con mis imágenes guardadas no regresar en la orientación correcta – especialmente los que derivan de la Cámara. El único inconveniente de usar el JPEG alternativa es que la transparencia no se conserva, ¿correcto?
    • También deben ser cautelosos que con JPEG consigue con pérdida de imágenes
  3. 3

    De verificación de la información EXIF de la imagen que se carga, no debe ser una etiqueta para la orientación. Utilice el valor para girar la imagen a la orientación adecuada.

    De este sitio web debe empezar.

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

    (La aplicación que se utiliza para ver la foto debe de tener esta construida en, es por eso que usted ve orientación correcta cuando la apertura de la foto)

    • Ahh muy interesante, sin embargo, cómo se podría ir sobre la captura que la orientación exif de datos?
  4. 0

    Intentar salvar la orientación de la imagen, entonces cuando se carga la imagen, compruebe si esa es la orientación correcta, y si no, gire la imagen con CGAffineTransform o lo que quieras.

  5. 0

    Puede utilizar la Imagen de e/S para guardar PNG imagen de archivo(o NSMutableData) con respecto a la orientación de la imagen original. En el siguiente ejemplo puedo guardar la imagen PNG a un archivo en 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;
    }

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

Dejar respuesta

Please enter your comment!
Please enter your name here