2017-02-02 5 views
0

방사형 그라데이션 마스크를 만들어 그림을 볼 수 있도록 그림에 구멍을 만들고 싶습니다. 나는 구멍을 가진 오버레이 이미지를 생성하고 이미지는 아래에 다음과 같이 볼 수 있습니다 :방사형 그라데이션 마스크를 만들어 그림에 구멍을 만듭니다.

enter image description here

나는 성공적으로 CGImageMaskCreate()를 사용하여이 이미지를 만들 수 있어요. 하지만 iOS 10.0에서 CGImageMaskCreate()의 비정상적인 동작으로 인해 다른 해결책을 찾고 있습니다.

이러한 솔루션 중 하나는 UIView의 maskView 속성을 사용하여 이미지 마스크를 만드는 것입니다. maskView을 사용하여 위에서 언급 한 이미지 효과를 만들기위한 코드를 작성할 수 있습니다. 그러나 그것은 정확한 결과를 제공하지 않습니다.

저는 Core Graphics에별로 좋지 않습니다. 어쩌면 그것이 내가 잘못 가고있는 부분을 파악할 수없는 이유 일 수 있습니다. 내 코드는 다음과 같습니다

CGRect rect = CGRectMake(0.0, 0.0, self.view.bounds.size.width, self.view.bounds.size.height); 
CGSize size = self.view.bounds.size; 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGFloat radius = 160.0; 
CGPoint center = CGPointMake(150.0, 150.0); 
CGFloat components[] = {1.0,1.0,1.0,1.0, 1.0,1.0,1.0,1.0, 1.0,1.0,1.0,1.0,  1.0,1.0,1.0,1.0, 1.0,1.0,1.0,0.5, 1.0,1.0,1.0,0.0}; 
CGFloat locations[] = {0.0, 0.1, 0.2, 0.8, 0.9, 1.0}; 

//creating bitmap context 
CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, size.width*4, colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrder32Big); 
//creating gradient 
CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, 6); 
CGContextDrawRadialGradient(context, gradient, center, 0.1, center, radius, 0); 
//get the gradient image 
CGImageRef imageHole = CGBitmapContextCreateImage(context); 
UIImage *img = [UIImage imageWithCGImage:imageHole]; 
CGGradientRelease(gradient); 

//creating mask view whose alpha channels will be used for masking 
UIImageView *maskImgView = [[UIImageView alloc] initWithFrame:CGRectMake(50.0, 50.0, 100.0, 100.0)]; 
[maskImgView setImage:img]; 

//This is the view on which I want to perform masking 
UIImageView *mainView = [[UIImageView alloc] initWithFrame:self.view.bounds]; 
[mainView setImage:[UIImage imageNamed:@"insta-logo.png"]]; 
mainView.maskView = maskImgView; 
[self.view addSubview:mainView]; 

이 결과 나는 점점 오전 :

enter image description here

완전히 붉은 색으로 가득 사용되는 이미지입니다. 결과 이미지를 그래디언트 영역에 투명하게 표시하여 나머지 부분은 내가 게시 한 첫 번째 사진과 같이 나머지 이미지의 불투명도를 유지하면서 나머지 영역을 빨간색으로 유지하기를 원합니다.

iOS 10 이상에서 CAShapeLayerCGImageMaskCreate()의 비정상적인 동작이 발생하기 때문에 maskView 속성을 사용하여이 효과를 만들려고합니다.

어떤 제안 사항이 도움이 될 것입니다. 감사합니다. 당신이 볼 수 있듯이, 내가 보여 노란색 배경을 허용, 이미지보기에서 방사형 그라데이션 구멍을 천공 한

enter image description here

:

+0

"iOS 10 이상에서 CAShapeLayer 및 CGImageMaskCreate()의 비정상적인 동작이 발생합니다."정확히 무엇을 말하고 있습니까? – matt

+0

CGImageMaskCreate()를 사용하면 마스크가 제대로 생성되지만 마스크 된 최종 이미지는 거의 투명합니다. 내 응용 프로그램의 경우이 문제는 iPhone 7 이상에서만 발생합니다. iOS 10의 일부 문제로 인해 그럴 것이라고 생각합니다. – maven25

+0

그건 그렇고,이 스레드에서 도움을 얻었습니다. https://forums.developer.apple.com/thread/50854 – maven25

답변

0

나는 당신이 설명하는 것은이 같은 생각 을 통하여.

어떻게 했습니까? 이미지보기의 mask으로 사용되는 명확하고 검은 색 값을 가진 CIFilter ("CIRadialGradient")입니다.

+0

_your_ 코드의 문제점은 그라디언트에 중심점이 없다는 것입니다. 맑은 가운데에서 검은 색으로 변색하는 대신 검정색 중심에서 맑은 바깥쪽으로 퇴색합니다. 사실, 색상 배열'components'는 거꾸로입니다 - 그게 전부입니다. 이 문제를 해결하면 코드가 올바르게 작동합니다. 내 방식은 내가 할 수있는 방법이지만, 당신의 방식은 더 정밀한 제어를 제공하므로, 바로 가서 당신의 방식으로하십시오. – matt

관련 문제