如何让CGContext Clip包含边框像素?

时间:2013-03-05 22:29:18

标签: ios core-graphics clipping

我正在使用CGMutablePathRef来创建任意多边形,因此我可以使用CGContextClip在我的上下文中剪切进一步的绘图。

这具有非常烦人且不想要的行为,即不包含路径的“边界”像素。因此,例如在我的代码片段中,我将一个矩形剪切成两半,然后为每一半着色 - 生成的图像留下一条细线,其中路径的边框没有着色:

enter image description here


- (void)drawRect:(CGRect)rect
{
    CGContextRef ctxt = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(ctxt, [UIColor whiteColor].CGColor);
    CGContextFillRect(ctxt, rect);
    CGContextSaveGState(ctxt);

    //Create a path to clip a triangle:
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 0, 0);
    CGPathAddLineToPoint(path, NULL, rect.size.width, 0);
    CGPathAddLineToPoint(path, NULL, 0, rect.size.height);
    CGContextAddPath(ctxt, path);
    CGContextClip(ctxt);

    //Fill the triangle with dark gray:
    CGContextSetFillColorWithColor(ctxt, [UIColor darkGrayColor].CGColor);
    CGContextFillRect(ctxt, rect);
    CGPathRelease(path);


    CGContextRestoreGState(ctxt);


    //Create a path to clip a triangle:
    path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, 0, rect.size.height);
    CGPathAddLineToPoint(path, NULL, rect.size.width, 0);
    CGPathAddLineToPoint(path, NULL, rect.size.width, rect.size.height);
    CGContextAddPath(ctxt, path);
    CGContextClip(ctxt);

    //Fill the triangle with dark Gray:
    CGContextSetFillColorWithColor(ctxt, [UIColor darkGrayColor].CGColor);
    CGContextFillRect(ctxt, rect);
    CGPathRelease(path);

}

如何以包含“边框”像素的方式剪辑上下文?

1 个答案:

答案 0 :(得分:2)

原因很可能是因为Quartz中的坐标对应于像素之间的“空格”,而不是像素本身。如果从(0,100)到(100,100)绘制一条笔划宽度为1的线条,您将看到它填充Y偏移99处的像素,Y偏移100处理所选颜色的50% ,使用其抗锯齿算法。另一方面,如果您从(0,100.5)到(100,100.5)绘制一条线,则只会填充Y偏移100处的像素,并且它们将完全填充您选择的颜色。

编辑:要详细了解此特定接缝,问题在于如何实现抗锯齿。 LCD显示器上的抗锯齿通常利用子像素渲染,其中像素可以水平分解为三个相邻的子像素,红色,绿色和蓝色分量。如果部分覆盖的像素位于填充区域的右侧,则可以优先考虑其红色分量,因为它在物理上更接近该区域,同样对于填充区域左侧的绿色分量。两个多边形部分覆盖相同的像素,但它们决定如何独立填充它们,因此无法保证所得到的颜色与两个多边形颜色的加权平均值完全相加。