6

iPhoneでコアイメージを使用しようとしています。クォーツを使用して色を合成してuiviewを描画することはできますが、各コンポーネントをに分割したいと思いますCALayer(UIviewはより多くのリソースを消費します)。

そのため、背景のビットマップをフィルタリングするために使用する白いマスクがあり、別のブレンディングモードを試してみたいと思います。残念ながら、レイヤーは色を「追加」しているだけです。

これが私のコードです:

@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

これがメインビューdrawrectコードで、CALayerを使用しています。

- (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];

}

何か問題がありますか?

4

3 に答える 3

7

複数の CALayer を UIView のグラフィック コンテキストに直接描画することで、複数の CALayer を合成する効果を得ることができました。

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

ところで、ビューのレイヤーのサブレイヤーとしてレイヤーを追加しませんでした (つまり、[myView.layer addSublayer:myLayer] を呼び出したことはありません)。

于 2010-08-15T04:01:39.743 に答える
5

レイヤーが画像コンテキストに事前にレンダリングされるため、この方法は Core Animation の欠陥ではないようです。Core Image は、背景レイヤーとその画像に対するこれらの画像のリアルタイム フィルタリング (アニメーション中など) に使用されます。そのため、この機能には CALayer の合成プロパティが使用されますが、Core Image の要件により、iPhone/iOS では (まだ) 利用できません。

ただし、OpenGLは私たちの状況でこれを行うことができます=)

edit(add): -drawInContext: および -drawLayer:inContext: で CGContext を使用してブレンド モードを設定することは、もちろん、そのコンテキストの画像に既にレンダリングまたは存在するものに対して効果があります。(コンテキスト(の画像)で何かがレンダリングされる前に設定されている場合、それは完全な黒または完全な白のいずれかに対するブレンドの効果です(どちらが=かわかりません)

于 2010-07-13T20:21:00.603 に答える
1

まったくそうではありません...これは、CAにまだ実装されていないように見えるため、openglを使用してこれを実現する方が簡単だと思います。

于 2010-06-01T13:27:49.367 に答える