user1602687
user1602687

Reputation: 1477

Simple resizing of UIImage in XCODE

Is there any way how to resize UIImage in as few lines as possible? I don't mind of ratio, I just want to set image resolution to 80x60. That's all

Upvotes: 7

Views: 23096

Answers (4)

Obj-Swift
Obj-Swift

Reputation: 2942

Use this class (add code to .h file accordingly)

#import "UIImage+Resize.h"

@implementation UIImage (Resize)

- (UIImage *)resizedImage:(CGSize)bounds {
   return [self resizedImage:bounds upScale:YES];
}

- (UIImage*)resizedImage:(CGSize)bounds upScale:(BOOL)upScale {
   CGSize originalSize = self.size;
   float xScale = bounds.width / originalSize.width;
   float yScale = bounds.height / originalSize.height;
   float scale = MIN(xScale, yScale);

   if (!upScale) {
      scale = MIN(scale, 1);
   }

   CGSize newSize = CGSizeMake(originalSize.width * scale, originalSize.height * scale);
   UIGraphicsBeginImageContextWithOptions(newSize, NO, [UIScreen mainScreen].scale);
   [self drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
   UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return resultImage;
}

Upvotes: 1

Septronic
Septronic

Reputation: 1176

I've found the following code on this page:

- (UIImage*)imageWithImage: (UIImage*) sourceImage scaledToWidth: (float) i_width{

if (sourceImage.size.width>sourceImage.size.height) {
    sourceImage = [[UIImage alloc] initWithCGImage: sourceImage.CGImage
                                             scale: 1.0
                                       orientation: UIImageOrientationRight];
}

float oldWidth = sourceImage.size.width;
float scaleFactor = i_width / oldWidth;
float newHeight = sourceImage.size.height * scaleFactor;
float newWidth = oldWidth * scaleFactor;

UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));   [sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
return newImage;
}

All you have to do is provide it with the i_width, and it will scale it accordingly.

I've added a little twist to it, so that if the picture is in landscape mode, it will be rotated to portrait, and then resized. If you want it to be the opposite (portrait to landscape), change this:

    if (sourceImage.size.width>sourceImage.size.height) {
    sourceImage = [[UIImage alloc] initWithCGImage: sourceImage.CGImage
                                             scale: 1.0
                                       orientation: UIImageOrientationRight];
}

to this:

    if (sourceImage.size.height>sourceImage.size.width) {
    sourceImage = [[UIImage alloc] initWithCGImage: sourceImage.CGImage
                                             scale: 1.0
                                       orientation: UIImageOrientationRight];
}

CAVEAT: my rotating method doesn't take into consideration if the picture is pointing left or right. In other words, If an image is landscape by upside down, my code can't recognise that. I hope someone else can shed some light on this though :)

Upvotes: 0

rohan-patel
rohan-patel

Reputation: 5782

- (void)resizeImage:(UIImage *)image
{
   CGSize origImageSize = [image size];
   CGRect imageRect = CGRectMake(0, 0, 80, 60);
   float ratio = MAX(newRect.size.width / origImageSize.width,
                  newRect.size.height / origImageSize.height);
   UIGraphicsBeginImageContextWithOptions(newRect.size, NO, 0.0);
   UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:newRect
                                                cornerRadius:5.0];
   [path addClip];
   CGRect imageRect;
   imageRect.size.width = ratio * origImageSize.width;
   imageRect.size.height = ratio * origImageSize.height;
   imageRect.origin.x = (newRect.size.width - imageRect.size.width) / 2.0;
   imageRect.origin.y = (newRect.size.height - imageRect.size.height) / 2.0;
   [image drawInRect:imageRect];
   UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext();
   NSData *data = UIImagePNGRepresentation(smallImage);
   UIGraphicsEndImageContext();
}

Do not forget to add CoreGraphics frameawork.

Upvotes: 1

C0L.PAN1C
C0L.PAN1C

Reputation: 12243

This may be overkill but, you can simply take your image, and create a graphics context at that resolution you want, then you can set the tempImage as the UIImageView, overwriting it.

        UIImage *image = YourImageView.image;
        UIImage *tempImage = nil;
        CGSize targetSize = CGSizeMake(80,60);
        UIGraphicsBeginImageContext(targetSize);

        CGRect thumbnailRect = CGRectMake(0, 0, 0, 0);
        thumbnailRect.origin = CGPointMake(0.0,0.0);
        thumbnailRect.size.width  = targetSize.width;
        thumbnailRect.size.height = targetSize.height;

        [image drawInRect:thumbnailRect];

        tempImage = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        YourImageView.image = tempImage;

Upvotes: 15

Related Questions