Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Resizing UIimages pulled from the Camera also ROTATES the UIimage?

I am getting UIimages from the camera and assigning them to UIImageViews to be displayed. When I do this the camera gives me a 1200 x 1600 pixel image which I then assign to a UIImageView in my Application. The image is displayed as expected in the image view under this condition. However, when I attempt to RESIZE the retrieved UIImage before assigning it to the UIImageView, the image is resizing as expected but there IS a problem in that somewhere (in the RESIZING code?) my UIImage is getting ROTATED... As a result, when I assign the resized UIImage to a UIImageView the image is rotated 90 degrees and appears stretched as the aspect ratio (1200 x 1600 pixels) was unchanged...

I am using this to get a UIImage from the Camera:

- (void) imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info {          myImg = [info objectForKey:@"UIImagePickerControllerOriginalImage"];         myResizedImg = [self resizeImage:myImg width:400 height:533];         [myImageView setImage:myResizedImg];  } 

I am using this to resize it:

-(UIImage *)resizeImage:(UIImage *)anImage width:(int)width height:(int)height {      CGImageRef imageRef = [anImage CGImage];      CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageRef);      if (alphaInfo == kCGImageAlphaNone)     alphaInfo = kCGImageAlphaNoneSkipLast;       CGContextRef bitmap = CGBitmapContextCreate(NULL, width, height, CGImageGetBitsPerComponent(imageRef), 4 * width, CGImageGetColorSpace(imageRef), alphaInfo);      CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), imageRef);      CGImageRef ref = CGBitmapContextCreateImage(bitmap);     UIImage *result = [UIImage imageWithCGImage:ref];      CGContextRelease(bitmap);     CGImageRelease(ref);      return result;   } 

QUESTION: How do I RESIZE a UIImage pulled from the Camera WITHOUT rotating the pixels?

like image 426
RexOnRoids Avatar asked Aug 11 '09 13:08

RexOnRoids


1 Answers

The reason your code doesn't work is because the imageOrientation on the code that you have is not being taken into account. Specifically, if the imageOrientation is right/left, then you need to both rotate the image and swap width/height. Here is some code to do this:

-(UIImage*)imageByScalingToSize:(CGSize)targetSize {     UIImage* sourceImage = self;      CGFloat targetWidth = targetSize.width;     CGFloat targetHeight = targetSize.height;      CGImageRef imageRef = [sourceImage CGImage];     CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);     CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);      if (bitmapInfo == kCGImageAlphaNone) {         bitmapInfo = kCGImageAlphaNoneSkipLast;     }      CGContextRef bitmap;      if (sourceImage.imageOrientation == UIImageOrientationUp || sourceImage.imageOrientation == UIImageOrientationDown) {         bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);      } else {         bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);      }         if (sourceImage.imageOrientation == UIImageOrientationLeft) {         CGContextRotateCTM (bitmap, radians(90));         CGContextTranslateCTM (bitmap, 0, -targetHeight);      } else if (sourceImage.imageOrientation == UIImageOrientationRight) {         CGContextRotateCTM (bitmap, radians(-90));         CGContextTranslateCTM (bitmap, -targetWidth, 0);      } else if (sourceImage.imageOrientation == UIImageOrientationUp) {         // NOTHING     } else if (sourceImage.imageOrientation == UIImageOrientationDown) {         CGContextTranslateCTM (bitmap, targetWidth, targetHeight);         CGContextRotateCTM (bitmap, radians(-180.));     }      CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth, targetHeight), imageRef);     CGImageRef ref = CGBitmapContextCreateImage(bitmap);     UIImage* newImage = [UIImage imageWithCGImage:ref];      CGContextRelease(bitmap);     CGImageRelease(ref);      return newImage;  } 

This will resize your image and rotate it to the correct orientation. If you need the definition for radians, it is:

static inline double radians (double degrees) {return degrees * M_PI/180;} 

The answer Daniel gave is also correct, but it suffers from the problem that it is not thread-safe, since you're using UIGraphicsBeginImageContext(). Since the above code only uses CG functions, you're all set. I also have a similar function to resize and do proper aspect fill on images - let me know if that's what you're looking for.

Note: I got the original function from this post, and did some modifications to make it work on JPEGs.

like image 134
Itay Avatar answered Sep 29 '22 18:09

Itay