核心图形混合导致亮点

时间:2012-06-25 15:55:09

标签: objective-c core-graphics

我正在尝试使用Core Graphics在黑色背景上绘制一个简单的网格图案。网格线将为绿色。我目前正在创建和绘制图像上下文,然后使用生成的图像来模式化我的视图背景:

    CGFloat gridSize = 45;
    UIGraphicsBeginImageContext(CGSizeMake(gridSize, gridSize));

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    UIGraphicsPushContext(ctx);

    // Create black background fill.
    CGContextSetFillColorWithColor(ctx, [[UIColor colorWithRed:0.0 
                                                         green:0.0
                                                          blue:0.0
                                                         alpha:1.0] CGColor]);
    CGContextMoveToPoint(ctx, 0, 0);
    CGContextAddLineToPoint(ctx, gridSize, 0);
    CGContextAddLineToPoint(ctx, gridSize, gridSize);
    CGContextAddLineToPoint(ctx, 0, gridSize);
    CGContextAddLineToPoint(ctx, 0, 0);
    CGContextFillPath(ctx);

    // Set context variables for line drawing.
    CGContextSetBlendMode(ctx, kCGBlendModeNormal);
    CGContextSetStrokeColorWithColor(ctx, [[UIColor colorWithRed:0.0 
                                                           green:1.0
                                                            blue:0.0
                                                           alpha:1.0] CGColor]);
    CGContextSetLineWidth(ctx, 1);

    // Draw top and bottom grid lines.
    CGContextMoveToPoint(ctx, 0, 0);
    CGContextAddLineToPoint(ctx, gridSize, 0);
    CGContextMoveToPoint(ctx, gridSize, gridSize);
    CGContextAddLineToPoint(ctx, 0, gridSize);
    CGContextStrokePath(ctx);

    // Draw left and right grid lines.
    CGContextMoveToPoint(ctx, gridSize, 0);
    CGContextAddLineToPoint(ctx, gridSize, gridSize);
    CGContextMoveToPoint(ctx, 0, gridSize);
    CGContextAddLineToPoint(ctx, 0, 0);
    CGContextStrokePath(ctx);

    // Draw a "cross" in the center of the image to troubleshoot blending.
    CGContextMoveToPoint(ctx, 20, 20);
    CGContextAddLineToPoint(ctx, 40, 20);
    CGContextStrokePath(ctx);

    CGContextMoveToPoint(ctx, 30, 10);
    CGContextAddLineToPoint(ctx, 30, 30);
    CGContextStrokePath(ctx);

    UIGraphicsPopContext();

    UIImage *gridImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    // Set background color to a pattern based on the drawn image.
    [self setBackgroundColor:[[UIColor alloc] initWithPatternImage:gridImage]];

但是,此代码会产生以下结果:

Gridlines

请注意,在任何线的交叉处都会出现更亮的区域。在网格图案中稍微随机放置的十字架放在那里只是为了测试在不受图案边缘影响的情况下是否仍然出现明亮区域(它们确实如此)。

我希望减轻线路交叉点的这些明亮区域。为了确保我没有意外地使用某种光学幻觉欺骗自己,我检查了线条中间和交叉点处的像素颜色。

绿线中点的像素值:

  • R:0
  • G:129
  • B:0

两条绿线交叉处的像素值:

  • R:0
  • G:191
  • B:0

我已查看有关混合模式的Apple Core Graphics文档,并确定默认混合模式为kCGBlendModeNormal,在使用alpha = 1绘制颜色时应该“完全遮盖背景“,以及任何以前涂过的颜色。虽然这是默认的混合模式,但我仍然在上面的代码中明确地设置它,但我仍然看到这些明亮的正方形。

我期望的是看到均匀绿色的线条,可能是RGB配置文件:

  • R:0
  • G:255
  • B:0

我错过了什么?

1 个答案:

答案 0 :(得分:1)

看起来这些线条的绘制幅度为50%但是指定线宽的两倍。如果您的线宽为1像素,但使用整数坐标绘制水平或垂直线,则会发生这种情况。

您的坐标指定从开始到结束坐标的无限细线。然后,绘制的线应延伸到细线的两侧,行程宽度的一半。在您的情况下,这意味着线需要覆盖网格左侧和右侧或顶部和底部的半个像素。由于只能绘制完整像素,因此alpha减少到50%,而是绘制全像素。

解决方案很简单:在所有坐标上加0.5。