2

I make a picture with phone (640*480) and put it inside uiimageview (300*300) with scale to fill options set. I need to send the same image that is displayed inside uiimageview (300*300, croped, resized) to server....

How can i get it?

Rinju Jain
  • 1,694
  • 1
  • 14
  • 23
DixieFlatline
  • 7,895
  • 24
  • 95
  • 147

2 Answers2

3

There is a quick a dirty way to do this, by rendering the UIImageView layer to a graphics context.

UIGraphicsBeginImageContext(self.bounds.size);
[self.imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

you will need to import <QuartzCore/QuartzCore.h> for this.

The other way would be to do the calculations for AspectFill your self.

 CGSize finalImageSize = CGSizeMake(300,300);
 CGImageRef sourceImageRef = yourImage.CGImage;

CGFloat horizontalRatio = finalImageSize.width / CGImageGetWidth(sourceImageRef);
CGFloat verticalRatio = finalImageSize.height / CGImageGetHeight(sourceImageRef);
CGFloat ratio = MAX(horizontalRatio, verticalRatio); //AspectFill
CGSize aspectFillSize = CGSizeMake(CGImageGetWidth(sourceImageRef) * ratio, CGImageGetHeight(sourceImageRef) * ratio);


CGContextRef context = CGBitmapContextCreate(NULL,
                                             finalImageSize.width,
                                             finalImageSize.height,
                                             CGImageGetBitsPerComponent(sourceImageRef),
                                             0,
                                             CGImageGetColorSpace(sourceImageRef),
                                             CGImageGetBitmapInfo(sourceImageRef));

//Draw our image centered vertically and horizontally in our context.
CGContextDrawImage(context, 
                   CGRectMake((finalImageSize.width-aspectFillSize.width)/2,
                              (finalImageSize.height-aspectFillSize.height)/2,
                              aspectFillSize.width,
                              aspectFillSize.height),
                   sourceImageRef);

//Start cleaning up..
CGImageRelease(sourceImageRef);

CGImageRef finalImageRef = CGBitmapContextCreateImage(context);
UIImage *finalImage = [UIImage imageWithCGImage:finalImageRef];

CGContextRelease(context);
CGImageRelease(finalImageRef);
return finalImage;
Bill Wilson
  • 954
  • 6
  • 9
0

From the documentation:

UIViewContentModeScaleToFill

Scales the content to fit the size of itself by changing the aspect ratio of the content if necessary.

You can do the maths. Or if you are feeling particularly lazy, there is this hack way.

Community
  • 1
  • 1
Paul de Lange
  • 10,613
  • 10
  • 41
  • 56