复合颜色:iPhone上的CALayer和混合模式

时间:2009-11-01 23:19:09

标签: iphone calayer blend mode

我正在尝试在iphone上使用核心图像。我可以使用quartz来合成我的颜色以绘制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];

}

有什么不对吗?

3 个答案:

答案 0 :(得分:7)

通过将多个CALayer直接绘制到UIView的图形上下文中,我设法获得了合成多个CALayers的效果。

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

BTW,我没有将图层添加为视图图层的子图层(我从未调用[myView.layer addSublayer:myLayer])

答案 1 :(得分:4)

这种方法似乎不是Core Animation的一个缺陷,因为这些层被预先渲染到图像上下文中。核心图像用于对照背景图层及其图像对这些图像进行实时过滤(在动画期间等等)。因此,CALayer的合成属性被用于此功能,由于Core Image的要求,这些功能在iPhone / iOS上尚未提供。

OpenGL可以在我们的情况下为我们这样做,但是=)

编辑(添加):使用CGContext在-drawInContext中设置混合模式:和-drawLayer:inContext:当然,它仍然对已经呈现或存在于该上下文图像中的内容有效。 (当在上下文(图像)中呈现任何内容之前设置它时,它是混合对整个黑色或全白色的效果(我不确定哪个=)

答案 2 :(得分:1)

完全没有...我认为使用opengl更容易实现这一点,因为它似乎尚未在CA中实​​现。