图片圆角iPhone development – UIImage with round corners

来源:互联网 发布:汇率分析软件 编辑:程序博客网 时间:2024/05/20 02:27
I’ve updated the code in the post and the sample project at the end of the post. Many thanks to Xavier Schott for his helpful comment!

I recently dwelled into the world of Cocoa programing for the iPhone a few weeks back. My good friend and collegue at Avantime, Hampus, and I bought iPhones 3G when we were on vaccation in Italy this summer. Italy sells unlocked iPhones so we’re not stuck with using Telia which is the only Swedish operator who carry iPhone. I actually had a quick look at iPhone development when the first iPhone came out using the toolchain but I didn’t really enjoy it at the time, perhaps it’s because I only owned an iPod touch at the time.

Anyhow. Hampus and I have been hacking away on our first iPhone app and I thought I’d share some usefull code for rounding off corners of an UIImage. This code is based on various stuff I found on google but I made a nice image manipulation class which rounds of corners:

ImageManipulation.h

#import  @interface ImageManipulator : NSObject {}+(UIImage *)makeRoundCornerImage:(UIImage*)img :(int) cornerWidth :(int) cornerHeight;@end

ImageManipulation.m

#import "ImageManipulator.h" @implementation ImageManipulator 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);    CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1);    CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1);    CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1);    CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1);    CGContextClosePath(context);    CGContextRestoreGState(context);} +(UIImage *)makeRoundCornerImage : (UIImage*) img : (int) cornerWidth : (int) cornerHeight{UIImage * newImage = nilif( nil != img){NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];int w = img.size.width;int h = img.size.height; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); CGContextBeginPath(context);CGRect rect = CGRectMake(0, 0, img.size.width, img.size.height);addRoundedRectToPath(context, rect, cornerWidth, cornerHeight);CGContextClosePath(context);CGContextClip(context); CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage); CGImageRef imageMasked = CGBitmapContextCreateImage(context);CGContextRelease(context);CGColorSpaceRelease(colorSpace);[img release]; newImage = [[UIImage imageWithCGImage:imageMasked] retain];CGImageRelease(imageMasked)[pool release];}     return newImage;} @end

Just call the static method makeRoundCornerImage and pass your image to have the image rounded off the way you want.

Note that you do need the CoreGraphics framework for this to compile. By request I’ve also whipped up a small demo of how to use this. If you don’t like to copy-paste code you can grab the class files from the demo.


地址:http://blog.sallarp.com/iphone-uiimage-round-corners/

0 0
原创粉丝点击