12

Programatically I have fetched image from my camera in my app. It has been fetched nicely but when I shift to another view and dismiss that view at that time my image automatically rotate -90 degree.

and this change occurs only first time after that when I shift no change occurs means image stays in -90 degree state and this happens only when I captued image from camera. when I fetch image from photo library no issue has been found.

following image is my original image

Original image

and this is rotated image

rotated image

I don't know why this change happen.

Community
  • 1
  • 1
iPhone
  • 4,092
  • 3
  • 34
  • 58

7 Answers7

14

you have to use this function to rotate image captured by camera

 - (void)imagePickerController:(UIImagePickerController *)picker
                didFinishPickingImage:(UIImage *)image
                                    editingInfo:(NSDictionary *)editingInfo
{
    image = [self scaleAndRotateImage:image];
    [self useImage:image];
    [[picker parentViewController] dismissModalViewControllerAnimated:YES];
}


- (void)scaleAndRotateImage:(UIImage *)image
{
    int kMaxResolution = 320; // Or whatever

    CGImageRef imgRef = image.CGImage;

    CGFloat width = CGImageGetWidth(imgRef);
    CGFloat height = CGImageGetHeight(imgRef);

    CGAffineTransform transform = CGAffineTransformIdentity;
    CGRect bounds = CGRectMake(0, 0, width, height);
    if (width > kMaxResolution || height > kMaxResolution) {
        CGFloat ratio = width/height;
        if (ratio > 1) {
            bounds.size.width = kMaxResolution;
            bounds.size.height = bounds.size.width / ratio;
        }
        else {
            bounds.size.height = kMaxResolution;
            bounds.size.width = bounds.size.height * ratio;
        }
    }

    CGFloat scaleRatio = bounds.size.width / width;
    CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
    CGFloat boundHeight;
    UIImageOrientation orient = image.imageOrientation;
    switch(orient) {

        case UIImageOrientationUp: //EXIF = 1
            transform = CGAffineTransformIdentity;
            break;

        case UIImageOrientationUpMirrored: //EXIF = 2
            transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            break;

        case UIImageOrientationDown: //EXIF = 3
            transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;

        case UIImageOrientationDownMirrored: //EXIF = 4
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
            transform = CGAffineTransformScale(transform, 1.0, -1.0);
            break;

        case UIImageOrientationLeftMirrored: //EXIF = 5
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationLeft: //EXIF = 6
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationRightMirrored: //EXIF = 7
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeScale(-1.0, 1.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        case UIImageOrientationRight: //EXIF = 8
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        default:
            [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];

    }

    UIGraphicsBeginImageContext(bounds.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {
        CGContextScaleCTM(context, -scaleRatio, scaleRatio);
        CGContextTranslateCTM(context, -height, 0);
    }
    else {
        CGContextScaleCTM(context, scaleRatio, -scaleRatio);
        CGContextTranslateCTM(context, 0, -height);
    }

    CGContextConcatCTM(context, transform);

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self setRotatedImage:imageCopy];
    //return imageCopy;
}
Hiren
  • 12,720
  • 7
  • 52
  • 72
  • 4
    pretty much for such a little rotation .__. – filou May 18 '12 at 09:35
  • i have the same problem in my app and i have tried your but it doesnt effect. Image still rotates. What can be the issue? – Purva Oct 03 '12 at 06:58
  • what's the issue please explain in detail – Hiren Oct 03 '12 at 07:13
  • 1
    After running an image that was obtained from a AVCaptureVideoDataOutput within an AVCaptureSession as a CGImageRef converted directly to UIImage it doesn't seem to do anything. I changed the orient variable to be set to [[UIDevice currentDevice] orientation] (making sure this runs in the main thread) but the whole thing is still rotated by 90 deg. What's the recommended way to adjust for orientation? – 0x6A75616E Nov 30 '12 at 07:06
  • @thatjuan i didn't get your point. can you send me demo for this? so I can solve your problem – Hiren Nov 30 '12 at 07:40
  • @Hi Ren I've posted a question about it here: http://stackoverflow.com/questions/13640746/what-is-the-recommended-way-to-deal-with-avcapturevideodataoutput-image-data-reg if you want to take a look – 0x6A75616E Nov 30 '12 at 08:01
4

The most simplest way to overcome this problem is by scaling the image inside didFinishPickingImage delegate. You can use the following code to scale by importing a class "UIImage+ImageScaling.h".

theImage =[UIImage imageWithImage:image scaledToSizeWithSameAspectRatio:CGSizeMake(400, 300)]; // for iphone.

Vineet Singh
  • 4,009
  • 1
  • 28
  • 39
Vishnu Kumar. S
  • 1,797
  • 1
  • 15
  • 35
1

This method works for me,

- (UIImage*) rotateImageAppropriately:(UIImage*)imageToRotate
{
   UIImage* properlyRotatedImage;

   CGImageRef imageRef = [imageToRotate CGImage];

   if (imageToRotate.imageOrientation == 0)
   {
       properlyRotatedImage = imageToRotate;
   }
   else if (imageToRotate.imageOrientation == 3)
   {

       CGSize imgsize = imageToRotate.size;
       UIGraphicsBeginImageContext(imgsize);
       [imageToRotate drawInRect:CGRectMake(0.0, 0.0, imgsize.width, imgsize.height)];
       properlyRotatedImage = UIGraphicsGetImageFromCurrentImageContext();
       UIGraphicsEndImageContext();
   }
   else if (imageToRotate.imageOrientation == 1)
   {
       properlyRotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:1];
   }

   return properlyRotatedImage;
}
cjd
  • 549
  • 3
  • 11
1

The bad behavior has now changed with 13.4. Images are now captured with accurate orientation.

noopmk
  • 41
  • 4
0

If you are still need some solution just refer this link where I posted my answer for this problem just refer edit and edit 1 also see the last 2 or 3 comments for further reference

Community
  • 1
  • 1
The iOSDev
  • 5,237
  • 7
  • 41
  • 78
0

Try this property

@property (nonatomic) CGAffineTransform cameraViewTransform

and rotate is with -90 degree and then capture the image. If doesn't work the use the code given by Cocoa Matters.

Inder Kumar Rathore
  • 39,458
  • 17
  • 135
  • 184
-1

It is due to your image orientation. so keep original image orientation. you will get the image orientation in your UIImagePickerController delegate method

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

sample code:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{

    UIImage *sourceImage = [info valueForKey:UIImagePickerControllerOriginalImage];

    NSData *data = UIImagePNGRepresentation(sourceImage);
    UIImage *tmp = [UIImage imageWithData:data];
    UIImage *afterFixingOrientation = [UIImage imageWithCGImage:tmp.CGImage
                                         scale:sourceImage.scale
                                   orientation:sourceImage.imageOrientation];

    [self.imagePickerController dismissViewControllerAnimated:YES completion:nil];
}
sateesh
  • 505
  • 4
  • 18