图像处理之抓图、倒影、圆角、立体图标

捕捉屏幕截图

CALayer实例使用Core Graphics的renderInContext方法可以将视图绘制到图像上下文中以便转化为其他UIImage实例。前提先#import <QuartzCore/QuartzCore.h>

+ (UIImage *) imageFromView: (UIView *)theView
{ 
    // draw a view's contents into an image context  UIGraphicsBeginImageContext(theView.frame.size); 
    CGContextRef context = UIGraphicsGetCurrentContext();
    [theView.layer renderInContext:context]; 
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 
    return theImage;
} 

注:UIGraphicsBeginImageContext(CGSize size)创建一个基于位图的上下文(context),并将其设置为当前上下文。函数功能与 UIGraphicsBeginImageContextWithOptions相同,相当于该方法的opaque参数为NO,scale因子为1.0。而UIGraphicsEndImageContext()方法是移除栈顶的基于当前位图的图形上下文。

视图添加倒影效果:

const CGFloat kReflectPercent = -0.25f; 
const CGFloat kReflectOpacity = 0.3f; 
const CGFloat kReflectDistance = 10.0f; 
+ (void)addSimpleReflectionToView:(UIView *)theView
{ 
    CALayer *reflectionLayer = [CALayer layer];
    reflectionLayer.contents = [theView layer].contents; 
    reflectionLayer.opacity = kReflectOpacity;
    reflectionLayer.frame=CGRectMake(0.0f,0.0f,theView.frame.size.width,theView.frame.size.height*kReflectPercent); 
    //倒影层框架设置,其中高度是原视图的百分比 
    CATransform3D stransform = CATransform3DMakeScale(1.0f,-1.0f,1.0f); CATransform3D transform=CATransform3DTranslate(stransform,0.0f,-(kReflectDistance + 
        theView.frame.size.height),0.0f);
    reflectionLayer.transform = transform; 
    reflectionLayer.sublayerTransform = reflectionLayer.transform;
    [[theView layer] addSublayer:reflectionLayer];
} 

另一:使用Core Graphics创建倒影

+ (CGImageRef) createGradientImage:(CGSize)size 
{ 
    CGFloat colors[] = {0.0,1.0,1.0,1.0}; 
    //在灰色设备色彩上建立一渐变 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); CGContextRef context=CGBitmapContextCreate(nil,size.width,size.height,8,0,colorSpace,kCGImageAlphaNone); 
    CGGradientRef 
        gradient=CGGradientCreateWithColorComponents(colorSpace,colors,NULL,2); CGColorSpaceRelease(colorSpace); 
    //绘制线性渐变 
    CGPoint p1 = CGPointZero; 
    CGPoint p2 = CGPointMake(0,size.height); CGContextDrawLinearGradient(context,gradient,p1,p2,kCGGradientDrawsAfterEndLocation);
    //Return the CGImage 
    CGImageRef theCGImage = CGBitmapContextCreateImage(context); CFRelease(gradient); 
    CGContextRelease(context); return theCGImage;
} 

//Create a shrunken frame for the reflection
+ (UIImage *) reflectionOfView:(UIView *)theView WithPercent:(CGFloat) percent 
{
    //Retain the width but shrink the height 
    CGSize size = CGSizeMake(theView.frame.size.width, theView.frame.size.height * percent); 
    //Shrink the View 
    UIGraphicsBeginImageContext(size);
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [theView.layer renderInContext:context]; 
    UIImage *partialimg = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
    //build the mask 
    CGImageRef mask = [ImageHelper createGradientImage:size]; 
    CGImageRef ref = CGImageCreateWithMask(partialimg.CGImage,mask); UIImage *theImage = [UIImage imageWithCGImage:ref]; CGImageRelease(ref); CGImageRelease(mask); return theImage; 
}
const CGFloat kReflectDistance = 10.0f; 
+ (void) addReflectionToView: (UIView *)theView 
{ 
    theView.clipsToBounds = NO; 
    UIImageView *reflection = [[UIImageView alloc] initWithImage:[ImageHelper reflectionOfView:theView withPercent:0.45f]]; 
    CGRect frame = reflection.frame; 
    frame.origin = CGPointMake(0.0f,theView.frame.size.height + kReflectDistance); reflection.frame = frame; 
    // add the reflection as a simple subview
    [theView addSubView:reflection]; 
    [reflection release];
} 

 

 实现圆角图片:

 

UIColor *color = [UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:0]; [aImage setBackgroundColor:color]; 
//设置背景透明 
aImage.layer.masksToBounds = YES; 
aImage.layer.cornerRadius = 5.0; 
aImage.layer.borderWidth = 0.5; 
aImage.layer.borderColor = [[UIColor grayColor] CGColor];

 

另有方法可见:http://www.4ucode.com/Study/Topic/2058289转载文章。

实现iPhone图标的水晶立体效果

- (void)viewDidLoad 
{
    [super viewDidLoad]; 
    UIGraphicsBeginImageContext(icon.bounds.size); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    const CGFloat components[4] = {0.0,0.4,0.0,1.0}; 
    CGContextSetFillColor(ctx, components); 
    CGContextFillRect(ctx, CGRectMake(0, 0, icon.bounds.size.width,icon.bounds.size.height)); 
    UIImage *background = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 
    UIImage *image = [UIImage imageNamed:@"icon.png"]; 
    UIImage *mask = [UIImage imageNamed:@"IconBase.png"]; 
    UIImage *roundCorner = [UIImage imageNamed:@"round-corner.png"]; icon.image = image;
    CALayer* subLayer = [[CALayer layer] retain];
    subLayer.frame = icon.bounds; 
    subLayer.contents = (id)[background CGImage];
    CALayer* maskLayer = [[CALayer layer] retain]; 
    maskLayer.frame = icon.bounds; 
    maskLayer.contents = (id)[mask CGImage]; 
    [subLayer setMask:maskLayer]; 
    [[icon layer] addSublayer:subLayer]; 
    CALayer* roundCornerLayer = [[CALayer layer] retain]; 
    roundCornerLayer.frame = icon.bounds; 
    roundCornerLayer.contents = (id)[roundCorner CGImage];
    [[icon layer] setMask:roundCornerLayer]; 
    [maskLayer release]; 
    [subLayer release]; 
    [roundCornerLayer release];
} 

 

 

 

 

posted @ 2012-06-05 17:03  妙笔  阅读(478)  评论(0编辑  收藏  举报