web-dev-qa-db-fra.com

Sauvegarder UIImage, chargez-le dans le mauvais sens

J'utilise le code suivant pour enregistrer et charger des images que je prends dans la bibliothèque ou que je prends à l'aide de l'appareil photo:

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

Voici comment définir l'image sélectionnée dans ma UIImageView:

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

Cependant, lorsque je prends et que je règle l'image à afficher dans ma UIImageView, tout va bien, mais lorsque je charge cette image, l'orientation est souvent mauvaise. Des idées? Quelqu'un a vécu cela ou sait-il comment résoudre ce problème?

Merci.

MODIFIER:

Il semble donc que si vous chargez une photo prise en mode portrait à l'envers, elle se charge dans cette orientation, si vous prenez une photo en mode paysage, elle se charge dans cette orientation. Des idées sur la façon de contourner cela? Quelle que soit l'orientation qu'ils chargent, ils retournent toujours sous le nom UIImageOrientationUp.

35
Josh Kahane

J'ai rencontré un problème similaire et voici comment je l'ai résolu.

Pendant que nous sauvegardons une image, nous devons enregistrer ses informations d’orientation avec l’image ...

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

Et nous chargeons l’image dont nous avons besoin lit ses informations d’orientation et les applique à l’image…

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

orientedImage est ce dont nous avons besoin.

Merci,

27
Ravin

La cause principale est que le format PNG ne contient pas d'informations d'orientation de l'image, contrairement au format JPEG. Le moyen le plus simple de résoudre ce problème consiste donc à enregistrer votre fichier au format JPEG à l’aide de UIImageJPEGRepresentation ().

54
Suyuan Chang

Vérifiez les informations EXIF ​​pour l'image que vous chargez, il devrait y avoir une balise pour l'orientation. Utilisez la valeur pour faire pivoter votre image dans la bonne orientation.

Ce site Web devrait vous aider à démarrer.

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

(L'application que vous avez utilisée pour afficher la photo doit l'avoir intégrée, c'est pourquoi vous voyez l'orientation correcte lorsque vous ouvrez la photo)

3
Derek Li

Essayez également de sauvegarder l’orientation de l’image. Lorsque vous chargez cette image, vérifiez si l’orientation est correcte et, si ce n’est pas le cas, faites pivoter l’image avec CGAffineTransform ou ce que vous voulez.

0
Federico Cella

Vous pouvez utiliser Image I/O pour enregistrer une image PNG dans un fichier (ou NSMutableData) en ce qui concerne l'orientation de l'image d'origine. Dans l'exemple ci-dessous, j'enregistre l'image PNG dans un fichier à 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: est une méthode de la catégorie 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;
}

Vous pouvez également enregistrer l’image dans NSMutableData en utilisant CGImageDestinationCreateWithData et transmettre NSMutableData au lieu de NSURL dans CGImageDestinationCreateWithURL.

0
KudoCC