1

我正在使用 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++;
        }
    }
}
4

0 回答 0