Search code examples
iphoneobjective-cios5

iphone : image captured from camera changes orientation


I made an iphone app to capture image from camera and to set that image in next view. But the problem is that image is rotated. i.e landscape image becomes potraite and protraite image becomes landscape. I have referred many codes but could not get solution.

My code is :

- (void)btnCapturePressed
{
 if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
        {

            picker=[[UIImagePickerController alloc] init];
            picker.delegate=self;

            [picker setAllowsEditing:YES];

            picker.sourceType=UIImagePickerControllerSourceTypeCamera;
            //[self.navigationController pushViewController:(UIViewController *)ipc animated:YES];
            [self presentModalViewController:picker animated:YES];
            [picker release];
      }
}

-(void) imagePickerController:(UIImagePickerController *) picker didFinishPickingMediaWithInfo :(NSDictionary *)info
{
           UIImage *imageToScale=[info objectForKey:UIImagePickerControllerOriginalImage];

            imgView = [[UIImageView alloc] initWithImage:imageToScale];

            [picker presentModalViewController:cropper animated:YES];
}

I have also refered the link. with same problem, but could not find the solution.

Please help me.

Thanks.


Solution

  • So for that at the time of image take store the orientation of the device and pass it to the method below as parameter Here just give any name to method and pass the parameter orientation

    switch (orientation) {
                case UIDeviceOrientationPortrait:
                    [featureLayer setAffineTransform:CGAffineTransformMakeRotation(DegreesToRadians(0.))];
                    break;
                case UIDeviceOrientationPortraitUpsideDown:
                    [featureLayer setAffineTransform:CGAffineTransformMakeRotation(DegreesToRadians(180.))];
                    break;
                case UIDeviceOrientationLandscapeLeft:
                    [featureLayer setAffineTransform:CGAffineTransformMakeRotation(DegreesToRadians(90.))];
                    break;
                case UIDeviceOrientationLandscapeRight:
                    [featureLayer setAffineTransform:CGAffineTransformMakeRotation(DegreesToRadians(-90.))];
                    break;
                case UIDeviceOrientationFaceUp:
                case UIDeviceOrientationFaceDown:
                default:
                    break; // leave the layer in its last known orientation
            }
    

    and the macro I have used here DegreesToRadians() is as follow

    static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;};
    

    This will definitely works.

    Happy Coding :)

    EDIT

    If the above code doesn't work well then use this one

    @interface UIImage (RotationMethods)
    - (UIImage *)imageRotatedByDegrees:(CGFloat)degrees;
    @end
    
    @implementation UIImage (RotationMethods)
    
    - (UIImage *)imageRotatedByDegrees:(CGFloat)degrees 
    {   
        // calculate the size of the rotated view's containing box for our drawing space
        UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
        CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
        rotatedViewBox.transform = t;
        CGSize rotatedSize = rotatedViewBox.frame.size;
    
        // Create the bitmap context
        UIGraphicsBeginImageContext(rotatedSize);
        CGContextRef bitmap = UIGraphicsGetCurrentContext();
    
        // Move the origin to the middle of the image so we will rotate and scale around the center.
        CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);
    
        //   // Rotate the image context
        CGContextRotateCTM(bitmap, DegreesToRadians(degrees));
    
        // Now, draw the rotated/scaled image into the context
        CGContextScaleCTM(bitmap, 1.0, -1.0);
        CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);
    
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage;
    
    }
    @end
    

    and then call the above function as below

    switch (orientation) {
            case UIDeviceOrientationPortrait:
                image = [image imageRotatedByDegrees:0];
                break;
            case UIDeviceOrientationPortraitUpsideDown:
                image = [image imageRotatedByDegrees:180];
                break;
            case UIDeviceOrientationLandscapeLeft:
                image = [image imageRotatedByDegrees:-90];
                break;
            case UIDeviceOrientationLandscapeRight:
                image = [image imageRotatedByDegrees:90];
                break;
            case UIDeviceOrientationFaceUp:
            case UIDeviceOrientationFaceDown:
            default:
                break; // leave the layer in its last known orientation
        }   
    

    If the image is not in required orientation then add 90 to all of the above imageRotatedByDegrees's argument (i.e. if it is 0 then it will be 0+90) or as you required.

    EDIT 1

    UIDeviceOrientation curDeviceOrientation = [[UIDevice currentDevice] orientation];