Advertise here




Advertise here

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

rotate a UIImage help

ddavtianddavtian Posts: 10Registered Users
edited October 2009 in iOS SDK Development
Hi,

Any image taken with the camera and saved as a UIImage doesn't seem to come out right, orientation wise that is. Does anyway have a solution on how to rotate the image to it's proper state?

Many Thanks
Dave
Post edited by ddavtian on

Replies

  • FastrakFastrak Posts: 108Registered Users
    edited May 2008
    Either add it to a UIImageView and set a rotation transform or, if you need it to stay a UIImage, you will need to drop down to core graphics to rotate it (or flip it)
  • ddavtianddavtian Posts: 10Registered Users
    edited May 2008
    I think working with a UIImageView would be easier, do you my any chance have an example you can share?

    Basically what I want to do is this

    UIIMage --> UIImageView --> rotate --> UIImage --> send

    Currently I have the UIImage and it's sending as is.

    Thanks in Advance
    Dave
  • scottiphonescottiphone Posts: 802Registered Users
    edited May 2008
    Look up UIImageOrientation in the docs. There are settings that can be applied to UIImage.
    I think there's info in the editinfo from the camera picker.

    If you want to rotate it directly use CGAffineTransformRotate.
  • ddavtianddavtian Posts: 10Registered Users
    edited May 2008
    Hmm would this work?

    +(UIImage *)rotateImage:(UIImage *)image {

    int orient = image.imageOrientation;

    UIImageView *imageView = [[UIImageView alloc] init];

    UIImage *imageCopy = [[UIImage alloc] initWithCGImage:image.CGImage];


    switch (orient) {
    case UIImageOrientationLeft:
    imageView.transform = CGAffineTransformMakeRotation(3.0 * M_PI / 2.0);
    break;
    case UIImageOrientationRight:
    imageView.transform = CGAffineTransformMakeRotation(M_PI / 2.0);
    break;
    case UIImageOrientationDown: //EXIF = 3
    imageView.transform = CGAffineTransformMakeRotation(M_PI);
    default:
    break;
    }

    imageView.image = imageCopy;
    return (imageView.image);
    }
  • scottiphonescottiphone Posts: 802Registered Users
    edited May 2008
    I haven't studied your code in too much detail but place a draw function after the transform to see if it's working.

    Note that if you use orientation I don't think you have to rotate it manually. Since drawing ir a different orientation for the UI compared to some other image libraries they try to make it reasonable to do. Do a search of the example code for orientation or transform.
    Once again try drawing before and after so you can see what happens.

    You may have to draw and capture it.

    Note that you'll have leaks since you've allocated a couple of objects but haven't released them.
  • pinpointpinpoint Posts: 59Registered Users @
    edited February 2009
    did anyone get this to work?

    I'm examining the UIImage.orientation of both pics selected from the library and pics taken with the camera, and they're both "UP"... yet my camera pics show on the screen sideways. Oddly enough i'm using the same technique to generate thumbnails, and they're coming out the right orientation.

    Thanks!
    <font color="Red">Dave Peat</font><br />
    <a href="http://iphone.pinpointsolutionsinc.com"; target="_blank">Pinpoint Solutions, Inc.</a>
  • pinpointpinpoint Posts: 59Registered Users @
    edited February 2009
    OK, I was looking at the image at the wrong point- the UIImage returned by the camera is "RIGHT", not UP.

    Once i've saved the image out, and re-read it back in again it's UP.

    That still leaves me with the task of rotating the image 90 degrees before I save it... anyone have a little code that works?

    Thanks!
    <font color="Red">Dave Peat</font><br />
    <a href="http://iphone.pinpointsolutionsinc.com"; target="_blank">Pinpoint Solutions, Inc.</a>
  • pinpointpinpoint Posts: 59Registered Users @
    edited February 2009
    pinpoint wrote: »
    OK, I was looking at the image at the wrong point- the UIImage returned by the camera is "RIGHT", not UP.

    Once i've saved the image out, and re-read it back in again it's UP.

    That still leaves me with the task of rotating the image 90 degrees before I save it... anyone have a little code that works?

    Thanks!

    Found code that does this here. Works like a charm.
    <font color="Red">Dave Peat</font><br />
    <a href="http://iphone.pinpointsolutionsinc.com"; target="_blank">Pinpoint Solutions, Inc.</a>
  • svveetsvveet Posts: 180Registered Users @ @
    edited October 2009
    Hi,

    Ive used his code but my images are still the same.

    Im not sure how his code works, can someone guide me how to rotate back the image with his code?

    Logic High Software UIImage fix

    Here is my code:
    UIImage *imageimage2 = [[UIImage alloc] initWithContentsOfFile:pathToImage];
    [self scaleAndRotateImage:imageimage2];
    

    this is his code, i have modified a bit at the end
    - (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;
    }
    
  • svveetsvveet Posts: 180Registered Users @ @
    edited October 2009
    fixed, i need to rotate it before i save the camera image to file
    svveet wrote: »
    Hi,

    Ive used his code but my images are still the same.

    Im not sure how his code works, can someone guide me how to rotate back the image with his code?

    Logic High Software UIImage fix

    Here is my code:
    UIImage *imageimage2 = [[UIImage alloc] initWithContentsOfFile:pathToImage];
    [self scaleAndRotateImage:imageimage2];
    

    this is his code, i have modified a bit at the end
    - (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;
    }
    
Sign In or Register to comment.