2013-07-27 3 views
2

그래서 UIImages를 특정 모양으로 자르는 방법에 대한 해결책을 보았습니다. 그러나 육각형은 어떨까요?육각형 모양의 자르기 UIImage?

생각 : 하위 클래스 UIImage, drawRect 메서드를 변경하여 특정 섹션 만 그리시겠습니까?

EDIT : 더 구체적으로 말하자면 이미지 경계를 동일하게 유지하면서 육각형 외부의 이미지 데이터를 투명하게 만들려고하므로 이 표시됩니다. 이미지가 육각형 모양 인 경우 실제로는 이미지의 일부분 만 투명하게 보이는 동일한 직사각형 경계를가집니다.

확실하지 않습니다. 모두가 생각하는 것을 듣고 싶습니다.

+0

그냥 해명. 여기 '자르기'란 뜻은 무엇입니까? 결과 이미지는 이전처럼 경계를 유지하므로 육각형 외부의 이미지 데이터에 어떤 일이 일어나기를 원합니 까? 투명하게 만들고 결과 이미지를 디스크에 저장하지 않으시겠습니까? 육각형으로 가려진 부분없이 이미지를 직접 그릴 수 있습니까? – schmubob

+0

위의 수정! –

답변

10

이미지를 UIImageView에 넣을 수 있습니까? 일치하는 경우 :

CAShapeLayer을 새로 만듭니다 (QuartzCore를 가져 오십시오!). 육각형 모양의 CGPathRef 또는 UIBezierPath을 만들고 모양 레이어의 path 속성으로 설정합니다. 모양 레이어를 이미지보기 레이어의 mask으로 설정합니다.

당신이 UIImage 자체를 수정하려면, 당신은 아마 다음 CGContextClipPath를 사용하고 육각 경로 클리핑하는 CGGraphicsContext에 이미지를 그립니다 - (UIImage)hexagonImage 같은 카테고리의 방법을 추가 할 것입니다 그래픽에서 만든 UIImage을 반환 문맥.

편집 : 여기에 코드 샘플은

(참고 : 나는 내 대답을 건설에 도취 조금을 가지고, 당신은 UIBezierPath를 생성하는 몇 가지 코드 이외에, 아래에 언급 된 기술을 모두 볼 수 있습니다 N -gon, 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]; 
,617,

방법 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

샘플 코드가 게시되었습니다. –

관련 문제