3

I'm using the AGImagepickerContoller which could save multiple images from the camera roll, I am saving this way in the successBlock:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,    NSUserDomainMask ,YES );
    NSString *documentsDir = [paths objectAtIndex:0];
    NSString *savedImagePath = [documentsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"oneSlotImages%u.png", i]];

    ALAssetRepresentation *rep = [[info objectAtIndex: i] defaultRepresentation];
    UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage]];

    //----resize the images
    image = [self imageByScalingAndCroppingForSize:image toSize:CGSizeMake(256,256*image.size.height/image.size.width)];

    NSData *imageData = UIImagePNGRepresentation(image);
    [imageData writeToFile:savedImagePath atomically:YES];

My problem is when saving, and is used loaded in my preview. it looks like this: enter image description here

What I wanted is to have it like this in the preview:

enter image description here

I have read this iOS UIImagePickerController result image orientation after upload.

But I dont quite understand where I should put it in my code. Hope someone could guide in my problem. Thankyou.

Community
  • 1
  • 1
Bazinga
  • 2,456
  • 33
  • 76

4 Answers4

9

Here's the method, pass UIImage of whatever orientation it will return portrait image

-(UIImage*)rotateUIImage:(UIImage*)src {

    // No-op if the orientation is already correct
    if (src.imageOrientation == UIImageOrientationUp) return src ;

    // We need to calculate the proper transformation to make the image upright.
    // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
    CGAffineTransform transform = CGAffineTransformIdentity;

    switch (src.imageOrientation) {
        case UIImageOrientationDown:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, src.size.width, src.size.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;

        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
            transform = CGAffineTransformTranslate(transform, src.size.width, 0);
            transform = CGAffineTransformRotate(transform, M_PI_2);
            break;

        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, src.size.height);
            transform = CGAffineTransformRotate(transform, -M_PI_2);
            break;
        case UIImageOrientationUp:
        case UIImageOrientationUpMirrored:
            break;
    }

    switch (src.imageOrientation) {
        case UIImageOrientationUpMirrored:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, src.size.width, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;

        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, src.size.height, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
        case UIImageOrientationUp:
        case UIImageOrientationDown:
        case UIImageOrientationLeft:
        case UIImageOrientationRight:
            break;
    }

    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    CGContextRef ctx = CGBitmapContextCreate(NULL, src.size.width, src.size.height,
                                             CGImageGetBitsPerComponent(src.CGImage), 0,
                                             CGImageGetColorSpace(src.CGImage),
                                             CGImageGetBitmapInfo(src.CGImage));
    CGContextConcatCTM(ctx, transform);
    switch (src.imageOrientation) {
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            // Grr...
            CGContextDrawImage(ctx, CGRectMake(0,0,src.size.height,src.size.width), src.CGImage);
            break;

        default:
            CGContextDrawImage(ctx, CGRectMake(0,0,src.size.width,src.size.height), src.CGImage);
            break;
    }

    // And now we just create a new UIImage from the drawing context
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
    UIImage *img = [UIImage imageWithCGImage:cgimg];
    CGContextRelease(ctx);
    CGImageRelease(cgimg);
    return img;
}
Haider
  • 4,961
  • 2
  • 18
  • 25
4

Import that category method and put it before resizing like this .

image  = [self fixOrientation]; //Put it like this.    
image = [self imageByScalingAndCroppingForSize:image toSize:CGSizeMake(256,256*image.size.height/image.size.width)];

//resize the images

Or you can put it after resizing too like,

//----resize the images
image = [self imageByScalingAndCroppingForSize:image toSize:CGSizeMake(256,256*image.size.height/image.size.width)];
image  = [image fixOrientation]; //Put it like this.
Janak Nirmal
  • 22,706
  • 18
  • 63
  • 99
  • im on landscape so does it auto rotates image? sorry kinda new to this. – Bazinga Oct 01 '12 at 06:47
  • Yes That will fix the orientation as it has taken. So far I have experienced that method resolves issue for unexpected orientation changes. – Janak Nirmal Oct 01 '12 at 07:10
  • Have use it but still displays the image above, what am i doing wrong? – Bazinga Oct 03 '12 at 05:28
  • have seen this link too, is this okay? http://stackoverflow.com/questions/10600613/ios-image-orientation-has-strange-behavior – Bazinga Oct 03 '12 at 05:35
  • On the same OS i.e. MAC it should be not the problem. On cross platform it may be possible it shows different orientation as that question says. i.e. on MAC and WINDOWS different orientation. – Janak Nirmal Oct 03 '12 at 11:02
  • But my image still looks like the above, i dont know what is still wrong though. – Bazinga Oct 03 '12 at 11:19
3

Completely fixed my problem!

I was so frustrated with image orientation also unexpectedly rotating 90degrees in my ImageViews until i changed one line in my code from PNG to JPEG (seems to preserve original orientation data):

I replaced:

let data = UIImagePNGRepresentation(imageView.image!)

With:

let data = UIImageJPEGRepresentation(imageView.image!, 100)

Thanx a million to this related answer by Tomasz Nguyen MFMailComposeViewController image orientation

Hope this helps someone out there :)

Community
  • 1
  • 1
0
UIImage *temp = [UIImage imageWithCGImage:imgref scale:1.0f orientation:UIImageOrientationUp];
Maulik
  • 19,348
  • 14
  • 82
  • 137
v_1
  • 469
  • 7
  • 18