2009-11-01 10 views
6

iPhoneでコアイメージを使用しようとしています。私はクオーツを使用して色を合成して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は私たちのような状況で私たちのためにこれを行うことができ、しかし=)

編集(追加):-drawInContextにCGContextとブレンドモードを設定する:と-drawLayer:inContext:もちろんまだ何に影響を与えませんその文脈のイメージに既にレンダリングされているか存在していた。 (何かがコンテキスト(画像)でレンダリングされる前に設定されている場合、それは完全な黒または完全な白のいずれかとブレンドする効果です(私は確信していません)

+1

CoreImageがiOSで利用できないのですか? – openfrog

+1

@openfrogはい、OS Xと比較して制限されています。たとえば、OS Xの場合、CALayersはcompositing filte rs。 iOS上ではなく、そんなに。 –

7

私は直接のUIViewのグラフィックスコンテキストにそれらを描画することによって、複数のCALayersを合成

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

ところで、私は(それがI [myView.layer addSublayer:myLayer]と呼ばれることはありません)ビューのレイヤのサブレイヤとして、レイヤーを追加しませんでした。

+5

" - (void)drawLayer :(CALayer *)layer inContext:(CGContextRef)context"を実装していない場合は、[mylayer renderInContext:c]を使用する必要があります。 – jkr

関連する問題