图片圆角iPhone development – UIImage with round corners

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 = nil;
 
	if( 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UIImage是iOS中用于表示图像的类,可以用它来加载、显示和处理图片。以下是使用UIImage的基本步骤: 1. 导入UIImage库 ```objective-c #import <UIKit/UIKit.h> ``` 2. 加载图片 ```objective-c UIImage *image = [UIImage imageNamed:@"imageName"]; ``` 3. 显示图片 ```objective-c UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; [self.view addSubview:imageView]; ``` 4. 处理图片 UIImage提供了一些方法来处理图片,例如裁剪、缩放、旋转等。以下是一些常用的方法: 裁剪图片 ```objective-c CGRect rect = CGRectMake(x, y, width, height); CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, rect); UIImage *newImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); ``` 缩放图片 ```objective-c CGSize newSize = CGSizeMake(width, height); UIGraphicsBeginImageContext(newSize); [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); ``` 旋转图片 ```objective-c CGFloat radians = angle * M_PI / 180; CGAffineTransform transform = CGAffineTransformMakeRotation(radians); CGContextRef context = CGBitmapContextCreate(NULL, image.size.width, image.size.height, CGImageGetBitsPerComponent(image.CGImage), 0, CGImageGetColorSpace(image.CGImage), CGImageGetBitmapInfo(image.CGImage)); CGContextConcatCTM(context, transform); CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage); CGImageRef newImageRef = CGBitmapContextCreateImage(context); UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; CGContextRelease(context); CGImageRelease(newImageRef); ``` 以上是UIImage的基本使用方法,你可以根据自己的需要来进行更多的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值