Bazinga
Bazinga

Reputation: 2466

saving image with wrong orientation

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.

Upvotes: 3

Views: 5901

Answers (4)

J.SwiftNewbie
J.SwiftNewbie

Reputation: 31

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 :)

Upvotes: 3

Haider
Haider

Reputation: 4961

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;
}

Upvotes: 9

v_1
v_1

Reputation: 469

UIImage *temp = [UIImage imageWithCGImage:imgref scale:1.0f orientation:UIImageOrientationUp];

Upvotes: 0

Janak Nirmal
Janak Nirmal

Reputation: 22726

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.

Upvotes: 4

Related Questions