Сохранить 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.
Ответы
Ответ 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 или что хотите.