The simplest way to resize an UIImage? The simplest way to resize an UIImage? ios ios

The simplest way to resize an UIImage?


The simplest way is to set the frame of your UIImageView and set the contentMode to one of the resizing options.

Or you can use this utility method, if you actually need to resize an image:

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {    //UIGraphicsBeginImageContext(newSize);    // In next line, pass 0.0 to use the current device's pixel scaling factor (and thus account for Retina resolution).    // Pass 1.0 to force exact pixel size.    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();        UIGraphicsEndImageContext();    return newImage;}

Example usage:

#import "MYUtil.h"UIImage *myIcon = [MYUtil imageWithImage:myUIImageInstance scaledToSize:CGSizeMake(20, 20)];


Proper Swift 3.0 for iOS 10+ solution: Using ImageRenderer and closure syntax:

func imageWith(newSize: CGSize) -> UIImage {    let image = UIGraphicsImageRenderer(size: newSize).image { _ in        draw(in: CGRect(origin: .zero, size: newSize))    }            return image.withRenderingMode(renderingMode)}

And here's the Objective-C version:

@implementation UIImage (ResizeCategory)- (UIImage *)imageWithSize:(CGSize)newSize{    UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:newSize];    UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext*_Nonnull myContext) {        [self drawInRect:(CGRect) {.origin = CGPointZero, .size = newSize}];    }];    return [image imageWithRenderingMode:self.renderingMode];}@end


Here's a Swift version of Paul Lynch's answer

func imageWithImage(image:UIImage, scaledToSize newSize:CGSize) -> UIImage{    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0);    image.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()    UIGraphicsEndImageContext()    return newImage}

And as an extension:

public extension UIImage {    func copy(newSize: CGSize, retina: Bool = true) -> UIImage? {        // In next line, pass 0 to use the current device's pixel scaling factor (and thus account for Retina resolution).        // Pass 1 to force exact pixel size.        UIGraphicsBeginImageContextWithOptions(            /* size: */ newSize,            /* opaque: */ false,            /* scale: */ retina ? 0 : 1        )        defer { UIGraphicsEndImageContext() }        self.draw(in: CGRect(origin: .zero, size: newSize))        return UIGraphicsGetImageFromCurrentImageContext()    }}