2014-02-12 2 views
0

평면 색상의 작은 png를 오버레이해야합니다.색상이있는 UIImage 오버레이 : 잘못된 결과

- (UIImage *)overlayWithColor:(UIColor *)overlayColor { 


    UIGraphicsBeginImageContext(self.size); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 


    [overlayColor setFill]; 

    CGContextTranslateCTM(context, 0, self.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    CGContextSetBlendMode(context, kCGBlendModeNormal); 
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height); 
    CGContextDrawImage(context, rect, self.CGImage); 


    CGContextClipToMask(context, rect, self.CGImage); 
    CGContextAddRect(context, rect); 
    CGContextDrawPath(context,kCGPathFill); 

    UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return coloredImg; 

} 

하지만 결과는 매우 부드러운 아니지만 ... 여기에 원래 이미지 (검은 색 하나)와 오버레이 이미지 (흰색 하나)

enter image description here 을 : 내가 사용 코드는 enter image description here

답변

1

내가하는 방법은 다음과 같습니다 (사용자가 iOS7 만 해당한다고 가정). 원래 이미지를 뒤집습니다. Photoshop이나 이와 유사한 방법으로 검은 선이 투명 (알파)이되고 흰색 공간은 아니다 (그것이 어떤 색인지는 중요하지 않다. 투명하지 않은 한). 코드에서 다음 : 이미지 뷰는 이미지가 들어보기는

imageView.image = [imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
[imageView.image setTintColor:[UIColor orangeColor]]; 

.

1

문제는 당신이 코드 줄과 그래픽 컨텍스트 (스케일 팩터 1.0) 이외의 망막을 만드는

UIGraphicsBeginImageContext(self.size); 

당신은 문서

이 기능에서 볼 수 있다는 것입니다 opaque 매개 변수를 NO로 설정하고 비율 인수 1.0을 사용하여 UIGraphicsBeginImageContextWithOptions 함수를 호출하는 것과 같습니다.

대신 당신은 (메인 화면의 스케일 팩터와 동일하게 설명되어있는) 직접 UIGraphicsBeginImageContextWithOptions을 사용하고 축척 계수 0.0를 통과해야합니다

당신이 0.0의 값을 지정하면, 배율 인수는 장치의 주 화면 배율 인수로 설정됩니다.

.l.e. 다음을 사용해야합니다.

UIGraphicsBeginImageContextWithOptions(self.size, 
             NO, // opaque or not. NO means transparent 
             0.0); // scale factor. 0 means same as device