2009-11-01 4 views
6

아이폰에서 코어 이미지를 사용하려고합니다. Quartz를 사용하여 내 색상을 합성하여 UI를 그릴 수 있지만 각 구성 요소를 CALayer (UIview는 더 많은 리소스를 사용함)으로 구분하고 싶습니다.합성 색상 : iPhone의 CALayer 및 혼합 모드

그래서 배경 비트 맵을 필터링하는 데 사용하려는 흰색 마스크가 있고 다른 혼합 모드를 시도하고 싶습니다. 안타깝게도 레이어는 색상을 "추가"합니다. 여기

내 코드입니다 :

@implementation WhiteLayerHelper 

    - (void)drawLayer:(CALayer *)theLayer 
      inContext:(CGContextRef)myContext 
    { 
     // draw a white overlay, with special blending and alpha values, so that the saturation can be animated 
     CGContextSetBlendMode(myContext,kCGBlendModeSaturation); 
     CGContextSetRGBFillColor(myContext,1.0,1.0,1.0,0.9); 
     CGContextFillRect(myContext,[UIScreen mainScreen].bounds); 

    } 

@end 

그리고 여기 내의 CALayer 사용하는 경우 기본보기 drawrect 코드입니다 : 뭔가 잘못

- (void)drawRect:(CGRect)rect { 
    //get the drawing context 
    CGContextRef myContext = UIGraphicsGetCurrentContext(); 
    // draw the background 
    [self fillContext:myContext withBounds:m_overlayRect withImage:m_currentImage]; 
    [whiteLayer renderInContext:myContext]; 

} 

거기를?

답변

1

전혀 아닙니다 ... 아직 CA에서 구현되지 않은 것 같아 OpenGL을 사용하는 것이 더 쉽다고 생각합니다.

3

이 방법은 레이어가 이미지 컨텍스트로 미리 렌더링되기 때문에 Core Animation의 결함이 아닌 것으로 보입니다. 코어 이미지는 배경 레이어와 이미지에 대해 이러한 이미지의 실시간 필터링 (애니메이션 및 기타 등등)에 사용됩니다. 따라서 CALayer의 합성 속성은이 기능에 사용되며 Core Image의 요구 사항으로 인해 iPhone/iOS (아직)에서는 사용할 수 없습니다. OpenGL은 그러나, 우리의 상황에서 우리를 위해이 작업을 수행 할 수 있습니다

=)

편집 (추가) 및 -drawLayer : inContext : -drawInContext에 CGContext와 혼합 모드를 설정하면 여전히에 영향을 미칠 물론 무엇을 그 문맥의 이미지에 이미 렌더링되거나 존재했다. (어떤 이미지가 컨텍스트 (이미지)에서 렌더링되기 전에 설정되면 전체 검정색 또는 전체 흰색 중 하나에 블렌딩 효과가 발생합니다. (확실하지 않음)

+1

CoreImage가 iOS에서 현재 제공되지 않습니까? – openfrog

+1

@openfrog 예. OS X와 ​​비교하여 제한적입니다. 예를 들어 OS X에서 제한됩니다. CALayers는 합성 필트를 가질 수 있습니다. rs. iOS에서는 그리 많지 않습니다. –

7

. UIView의의 그래픽 컨텍스트에 직접 그림으로써 여러 CALayers를 합성

-(void)drawRect:(CGRect)rect { 
CGContextRef c = UIGraphicsGetCurrentContext(); 
CGContextSetBlendMode(c, kCGBlendModeDifference); 
[myLayer drawInContext:c]; 
} 

을 BTW, 내가보기의 레이어의 서브 레이어로 레이어를 추가하지 않은 (즉 내가 호출되지 않습니다 [myView.layer addSublayer : myLayer])

+5

"- (void) drawLayer : (CALayer *) layer inContext : (CGContextRef) context"와 같이 calayer 대리자 함수를 구현하지 않으면 [mylayer renderInContext : c] – jkr