绘画与透明度问题

时间:2012-12-12 19:48:45

标签: ios

我正在使用CGLayers来实现类似于Photoshop喷枪的“绘画”技术 - 并且遇到了一些奇怪的事情。当我使用透明度并覆盖区域时,颜色永远不会达到完全强度(如果alpha值低于0.5)。我的应用程序使用圆形“喷枪”图案,边缘不透明度下降,但我只是使用半透明的白色方块重现问题。当不透明度级别小于0.5时,重绘区域永远不会到达源图层的纯白色。我可能不会注意到,但我正在使用绘画的结果作为面具,而不能得到纯白色导致问题。有什么想法在这里发生了什么?目标iOS SDK 5.1。

下面是在黑色背景上多次绘制半透明正方形后的最终颜色:

opacity color
------  -----
1.0     255
0.9     255
0.8     255
0.7     255
0.6     255
0.5     255
0.4     254
0.3     253
0.2     252
0.1     247

显示问题的简化代码:

- (void)drawRect:(CGRect)rect
{
    CGContextRef viewContext = UIGraphicsGetCurrentContext();

    // Create grey gradient to compare final blend color
    CGRect lineRect = CGRectMake(20, 20, 1, 400);
    float greyLevel = 1.0;
    for(int i=0;i<728;i++)
    {
        CGContextSetRGBFillColor(viewContext, greyLevel, greyLevel, greyLevel, 1);
        CGContextFillRect(viewContext, lineRect);
        lineRect.origin.x += 1;
        greyLevel -= 0.0001;
    }

    // Create semi-transparent white square
    CGSize whiteSquareSize = CGSizeMake(40, 40);
    CGLayerRef whiteSquareLayer = CGLayerCreateWithContext (viewContext, whiteSquareSize, NULL);
    CGContextRef whiteSquareContext = CGLayerGetContext(whiteSquareLayer);
    CGContextSetAlpha(whiteSquareContext, 1.0f); // just to make sure
    CGContextSetRGBFillColor(whiteSquareContext, 1, 1, 1, 0.3); // ??? color never reaches pure white if alpha < 0.5
    CGRect whiteSquareRect = CGRectMake(0, 0, whiteSquareSize.width, whiteSquareSize.height);
    CGContextFillRect(whiteSquareContext, whiteSquareRect);

    // "Paint" with layer a bazillion times
    CGContextSetBlendMode(viewContext, kCGBlendModeNormal); // just to make sure
    CGContextSetAlpha(viewContext, 1.0); // just to make sure
    for(int strokeNum=0;strokeNum<100;strokeNum++)
    {
        CGPoint drawPoint = CGPointMake(0, 400);
        for(int x=0;x<730;x++)
        {
            CGContextDrawLayerAtPoint(viewContext, drawPoint, whiteSquareLayer);
            drawPoint.x++;
        }
    }
}

0 个答案:

没有答案