1

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

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

在此处输入图像描述


- (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);

}

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

4

1 回答 1

2

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

编辑:要更详细地了解这个特定的接缝,问题是如何完成抗锯齿。LCD 显示器上的抗锯齿通常利用子像素渲染,其中一个像素可以水平分解为三个相邻的子像素,即红色、绿色和蓝色分量。如果部分覆盖的像素位于填充区域的右侧,则可能会优先考虑其红色分量,因为它在物理上更靠近该区域,对于填充区域左侧的绿色分量也是如此。两个多边形都部分覆盖了相同的像素,但他们正在决定如何独立填充它们,因此不能保证生成的颜色将精确地加起来为两个多边形颜色的加权平均值。

于 2013-03-05T22:47:01.403 回答