2013-07-27 208 views
2

所以我见过如何将UIImages裁剪成某些形状的解决方案,但六角形以六角形的形状裁剪UIImage?

想法:子类UIImage,更改drawRect方法只绘制某些部分?

编辑:更具体地说,我希望保持图像边界相同,但使图像数据在六边形之外是透明的,所以它出现图像是六角形的形状,当实际上它具有相同的矩形边界,而图像的一部分是透明的。

不知道。很想听听你们的想法。

+0

。这里的'crop'是什么意思?由此产生的图像仍然会像以前一样有界限,所以你想要在六边形之外的图像数据发生什么?你是否希望它透明并将产生的图像保存到磁盘?您是否想直接绘制图像,而不用六边形遮盖部分? – schmubob

+0

上面做了编辑! –

回答

10

你可以把图片放在UIImageView?如果是这样的话:

创建一个新的CAShapeLayer(记得要导入QuartzCore!)。创建六边形形状的CGPathRefUIBezierPath,并将其设置为形状图层的path属性。将您的形状图层设置为图像视图图层的mask

如果你想修改UIImage本身,你可能会想添加一个类中的方法类似- (UIImage)hexagonImage其绘制图像到由使用CGContextClipPath,然后你的六边形路径钳位的CGGraphicsContext返回从图形创建UIImage上下文。

编辑:这里是代码样本

(注:我有点构建我的回答冲昏头脑,你可以同时看到下面提到的技术,除了一些代码生成UIBezierPathñ边形,在ZEPolygon示例项目)

方法1:面膜的图像与图CAShapeLayer

UIImageView *maskedImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]]; 

// insert your code for generating a hexagon here, or use mine from ZEPolygon 
UIBezierPath *nonagon = [UIBezierPath bezierPathWithPolygonInRect:maskedImageView.frame numberOfSides:9]; 

CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
shapeLayer.path = nonagon.CGPath; 

maskedImageView.layer.mask = shapeLayer; 

[self.view addSubview:maskedImageView]; 

方法2:UIImage类返回一个蒙面版本

UIImage+PolygonMasking.h

#import <UIKit/UIKit.h> 

@interface UIImage (ABCPolygonMasking) 

- (UIImage *)abc_imageMaskedWithPolygonWithNumberOfSides:(NSUInteger)numberOfSides; 

@end 

UIImage+PolygonMasking.m

只是为了澄清
#import "UIImage+PolygonMasking.h" 
#import "UIBezierPath+ZEPolygon.h" 

@implementation UIImage (ABCPolygonMasking) 

- (UIImage *)abc_imageMaskedWithPolygonWithNumberOfSides:(NSUInteger)numberOfSides 
{ 
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    // insert your code for generating a hexagon here, or use mine from ZEPolygon 
    UIBezierPath *path = [UIBezierPath bezierPathWithPolygonInRect:CGRectMake(0, 0, self.size.width, self.size.height) 
                numberOfSides:numberOfSides]; 

    CGContextSaveGState(ctx); 
    [path addClip]; 
    [self drawAtPoint:CGPointMake(0, 0)]; 
    CGContextRestoreGState(ctx); 

    UIImage *retImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return retImage; 
} 

@end 
+0

Zev - 非常感谢您对该做什么的高级概述。但是 - 我几乎没有使用CA和修改图像的经验。当你有机会时,你介意发布代码示例吗?这将不胜感激!谢谢。 –

+0

发布示例代码。 –