I am using the following code to save and load images that I pick from either the library or take using the camera:
//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];
}
This is how I set the picked image to be shown in my UIImageView
:
imgView.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
However, when I pick and image and set it to be shown in my UIImageView
it is fine, but when I load that image it often is the wrong orientation. Any ideas? Anyone experienced this or know how I could resolve this?
Thanks.
EDIT:
So it seems, if you load a photo which was taken a photo in portrait upside-down, it loads in that orientation, if you take a photo in landscape left it loads in that orientation. Any ideas how to get around this? Whatever orientation they load it they always return as UIImageOrientationUp.
Check the EXIF information for the image that you're loading, there should be a tag for orientation. Use the value to rotate your image to proper orientation.
This website should get you started.
http://www.impulseadventure.com/photo/exif-orientation.html
(The application you used to view the photo must have this built in, that's why you see correct orientation when opening the photo)
Try to save the image orientation too, then when you load that image, check if that's the correct orientation, and if not, rotate the image with CGAffineTransform or whatever you want.
I have faced similar problem and here is how I solved it.
While we save image we need to save its orientation information along with the image ...
And we load image we need to read its orientation information and apply it to the image…
orientedImage
is what we need.Thanks,
You can use Image I/O to save PNG image to file(or
NSMutableData
) with respect to the orientation of the original image. In the example below I save the PNG image to a file atpath
.cc_iOSOrientationToExifOrientation:
is a method ofUIImage
category.You can alternatively save the image to
NSMutableData
usingCGImageDestinationCreateWithData
and passNSMutableData
instead ofNSURL
inCGImageDestinationCreateWithURL
.The root cause is PNG format doesn't have image orientation information, but JPEG format does. So the easiest way to solve this problem is saving your file in JPEG format using UIImageJPEGRepresentation()