Сохранить UIImage, загрузить его в неправильной ориентации - PullRequest
36 голосов
/ 20 октября 2011

Я использую следующий код для сохранения и загрузки изображений, которые я выбираю из библиотеки или с помощью камеры:

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

Вот как я устанавливаю выбранное изображение, которое будет отображаться в моем UIImageView:

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

Тем не менее, когда я выбираю изображение и устанавливаю его так, чтобы оно отображалось в моем UIImageView, это нормально, но когда я загружаю это изображение, оно часто имеет неправильную ориентацию. Есть идеи? Кто-нибудь испытал это или знает, как я мог решить это?

Спасибо.

EDIT:

Похоже, что если вы загружаете фотографию, которая была сделана в портретной ориентации вверх ногами, она загружается в этой ориентации, если вы делаете фотографию в альбомной ориентации, если она загружается в этой ориентации. Есть идеи как обойти это? Независимо от ориентации, которую они загружают, они всегда возвращаются как UIImageOrientationUp.

Ответы [ 5 ]

55 голосов
/ 17 мая 2012

Основная причина в том, что формат PNG не имеет информации об ориентации изображения, но формат JPEG имеет. Таким образом, самый простой способ решить эту проблему - сохранить файл в формате JPEG с помощью UIImageJPEGRepresentation ()

27 голосов
/ 15 ноября 2011

Я столкнулся с подобной проблемой, и вот как я ее решил.

Пока мы сохраняем изображение, нам нужно сохранить информацию об ориентации вместе с изображением ...

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

И мы загружаем изображение, которое нам нужно , читаем информацию об ориентации и применяем его к изображению…

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

orientedImage - это то, что нам нужно.

Спасибо

3 голосов
/ 21 октября 2011

Проверьте информацию EXIF ​​для изображения, которое вы загружаете, должен быть тег для ориентации.Используйте значение, чтобы повернуть изображение в правильной ориентации.

Этот веб-сайт должен помочь вам начать работу.

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

(Приложение, которое вы использовали для просмотра фотографии, должно иметьвстроенный, поэтому при открытии фотографии вы видите правильную ориентацию)

0 голосов
/ 17 мая 2016

Вы можете использовать Image I / O для сохранения изображения PNG в файл (или NSMutableData) относительно ориентации исходного изображения. В приведенном ниже примере я сохраняю изображение PNG в файл с 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: - метод категории 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;
}

Вы также можете сохранить изображение в NSMutableData, используя CGImageDestinationCreateWithData и передать NSMutableData вместо NSURL в CGImageDestinationCreateWithURL.

0 голосов
/ 21 октября 2011

Попробуйте также сохранить ориентацию изображения, затем при загрузке этого изображения убедитесь, что это правильная ориентация, а если нет, поверните изображение с помощью CGAffineTransform или чего-либо другого.

...