Подтвердить что ты не робот

Сохранить UIImage, загрузить его в неправильной ориентации

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

//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.

4b9b3361

Ответ 1

У меня возникла аналогичная проблема, и вот как я ее решил.

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

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 - это то, что нам нужно.

Спасибо,

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

Вы можете использовать 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.

Ответ 5

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