我使用以下代码保存和加载从库中选择的图像或使用相机拍摄的图像:
//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
中时它很好,但是当我加载该图像时,它通常是错误的方向。有任何想法吗?有没有人经历过这个或知道如何解决这个问题?
感谢。
编辑:
所以看来,如果你加载的照片是以倒置的肖像照片拍摄的,那么它就是按照这个方向加载的,如果你拍摄横向照片,它就会以那个方向加载。任何想法如何解决这个问题?无论它们加载什么方向,它们总是以UIImageOrientationUp返回。
答案 0 :(得分:55)
根本原因是PNG格式没有图像方向信息,但JPEG格式没有。因此,解决此问题的最简单方法是使用UIImageJPEGRepresentation()将文件保存为JPEG格式
答案 1 :(得分:27)
我遇到过类似的问题,这就是我解决问题的方法。
在我们保存图片的同时,我们需要 保存其方向信息 以及图片......
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 :(得分:3)
检查您要加载的图片的EXIF信息,应该有方向标记。使用该值将图像旋转到正确的方向。
这个网站应该让你入门。
http://www.impulseadventure.com/photo/exif-orientation.html
(您用来查看照片的应用程序必须内置此功能,这就是打开照片时看到正确方向的原因)
答案 3 :(得分:0)
尝试保存图像方向,然后在加载图像时,检查是否是正确的方向,如果没有,请使用CGAffineTransform或任何您想要的图像旋转图像。
答案 4 :(得分:0)
您可以使用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
。