Search code examples
iphoneiosuiimagerounded-cornerssmoothing

UIImage with smooth rounded corners in quartz


I am just testing the following code to round corners on UIImage:

- (UIImage *)makeRoundedImage:(UIImage *)image radius:(float)radius;
{
    CALayer *imageLayer = [CALayer layer];
    imageLayer.frame = CGRectMake(0, 0, image.size.width, image.size.height);
    imageLayer.contents = (id) image.CGImage;

    imageLayer.masksToBounds = YES;
    imageLayer.cornerRadius = radius;

    UIGraphicsBeginImageContext(image.size);
    [imageLayer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *roundedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return roundedImage;
}

I looks fine unless you look closely to generated image. Corners are not smooth. How can I make corners to be smoother/softer ?

EDIT:

Processed image with rounded corners in quartz:

enter image description here

Like you can see corner is not smooth.

This is version with UIImageView's cornerRadius that is much more smoother.

enter image description here

Where is the catch ?


Solution

  • Here is UIImage category:

    - (UIImage *) imageWithRoundedCornersRadius: (float) radius
    {
        // Begin a new image that will be the new image with the rounded corners
        UIGraphicsBeginImageContextWithOptions(self.size, NO, 0);
    
        // Add a clip before drawing anything, in the shape of an rounded rect
        CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
        [[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius] addClip];
    
        // Draw your image
        [self drawInRect:rect];
    
        // Get the image, here setting the UIImageView image
        UIImage *roundedImage = UIGraphicsGetImageFromCurrentImageContext();
    
        // Lets forget about that we were drawing
        UIGraphicsEndImageContext();
    
        return roundedImage;
    }