- #import <UIKit/UIKit.h>
- @interface UIImage (Rounded)
- + (id)createRoundedRectImage:(UIImage*)image size:(CGSize)size radius:(NSInteger)r;
- @end
- #import "UIImage+Rounded.h"
- @implementation UIImage (Rounded)
- static void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth,
- float ovalHeight)
- {
- float fw, fh;
- if (ovalWidth == 0 || ovalHeight == 0)
- {
- CGContextAddRect(context, rect);
- return;
- }
- CGContextSaveGState(context);
- CGContextTranslateCTM(context, CGRectGetMinX(rect), CGRectGetMinY(rect));
- CGContextScaleCTM(context, ovalWidth, ovalHeight);
- fw = CGRectGetWidth(rect) / ovalWidth;
- fh = CGRectGetHeight(rect) / ovalHeight;
- CGContextMoveToPoint(context, fw, fh/2); // Start at lower right corner
- CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1); // Top right corner
- CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1); // Top left corner
- CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1); // Lower left corner
- CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); // Back to lower right
- CGContextClosePath(context);
- CGContextRestoreGState(context);
- }
- + (id)createRoundedRectImage:(UIImage*)image size:(CGSize)size radius:(NSInteger)r
- {
- // the size of CGContextRef
- int w = size.width;
- int h = size.height;
- UIImage *img = image;
- CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
- CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);
- CGRect rect = CGRectMake(0, 0, w, h);
- CGContextBeginPath(context);
- addRoundedRectToPath(context, rect, r, r);
- CGContextClosePath(context);
- CGContextClip(context);
- CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);
- CGImageRef imageMasked = CGBitmapContextCreateImage(context);
- img = [UIImage imageWithCGImage:imageMasked];
- CGContextRelease(context);
- CGColorSpaceRelease(colorSpace);
- CGImageRelease(imageMasked);
- return img;
- }