2014-04-18 101 views
2

我想用羽化圆圈裁剪图像。我用它来裁剪图像,但它只是裁剪正方形。ios - 用羽化边缘裁剪图像

CGImageRef imref = CGImageCreateWithImageInRect([newImage CGImage], faceRect); 
newSubImage = [UIImage imageWithCGImage:imref]; 

我想要的是用羽边进行裁剪?我应该用什么来实现它?

+0

看看这可以帮助http://stackoverflow.com/questions/17161088/how-to-refine-or-blur-or-smooth-只有一个只是这边缘/ 17175381#17175381 – iphonic

+0

嘿,这是什么样的作物? SomeGuy的回答看起来不错!他得到了它,否则就会有哗变的恩惠! – clearlight

回答

0

这个怎么样...首轮图像:

//round the image 

UIImageView *roundView = [[UIImageView alloc] initWithImage:smallImage]; 
UIGraphicsBeginImageContextWithOptions(roundView.bounds.size, NO, [UIScreen mainScreen].scale); 
[[UIBezierPath bezierPathWithRoundedRect:roundView.bounds 
          cornerRadius:roundView.frame.size.width/2] addClip]; 
[smallImage drawInRect:roundView.bounds]; 
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

,然后再圆,但具有更小的圆圈,通过调整阿尔法再次设置贝塞尔路径颜色为白色,但使其半透明...

3

这个片段将创建一个圆形切口与薄边边缘的

result

featherLocations变量可能是你需要调整

- (UIImage *) featheredImageWithImage:(UIImage *) image 
{ 
    // Locations of where the feather starts and ends (0 -> 1) 
    const CGFloat featherLocations[] = {0.9, 1}; 

    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    // Draw the original image 
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; 

    // A 'knock-out' gradient is used to generate a feather effect, 
    // the alpha channel on the colors defines the alpha of the drawn image 
    NSArray *gradientColors = @[(id)[UIColor colorWithWhite:0 alpha:1].CGColor, 
           (id)[UIColor colorWithWhite:0 alpha:0].CGColor]; 

    CGGradientRef gradient = CGGradientCreateWithColors(CGImageGetColorSpace(image.CGImage), (__bridge CFArrayRef)gradientColors, featherLocations); 

    // Because we're changing the draw mode below, 
    // take a snapshot of the current draw settings so we can reset them after 
    CGContextSaveGState(ctx); 

    // The kCGBlendModeDestinationIn blend mode will provide a'knock-out' effect on 
    // the previously drawn content, using the alpha channels of the gradient's colors 
    CGContextSetBlendMode(ctx, kCGBlendModeDestinationIn); 

    const CGPoint gradientCenter = CGPointMake(image.size.width/2, image.size.height/2); 

    // The gradient will start at the center (0) and extend to the closest edge (horizontal or vertical) 
    const CGFloat startRadius = 0; 
    const CGFloat endRadius = MIN(image.size.width, 
            image.size.height)/2; 

    // Draw the gradient to eliminate the pixels we don't want 
    CGContextDrawRadialGradient(ctx, gradient, gradientCenter, startRadius, gradientCenter, endRadius, (kCGGradientDrawsAfterEndLocation)); 

    CGGradientRelease(gradient); 
    gradient = NULL; 

    // Finally, restore state 
    // (note that in this example CGContextSaveGState and CGContextRestoreGState 
    // are optional because no further drawing happens after this point) 
    CGContextRestoreGState(ctx); 

    // Get the UIImage version 
    UIImage *featheredImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return featheredImage; 
} 
+0

任何机会我们可以做到这一点,而不使用阴影和任何颜色渐变?我想要我的图像的边缘(由自定义的uibezierpath定义)从图像淡入淡出,我不希望它的边框上有阴影或渐变,这可能吗?非常感谢。 –