2013-03-05 42 views
1

我正在使用CGMutablePathRef创建任意多边形,所以我可以使用CGContextClip在我的上下文中进一步绘制图形。我怎样才能让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); 

} 

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

回答

2

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

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

+0

所以你说,像素0,0的位置应该被引用为(-0.5,-0.5)? – typewriter 2013-03-06 06:44:39

+0

它应该被引用为(0.5,0.5),因为像素“at”(0,0)是从(0,0)到(1,1)的矩形。 – Tony 2013-03-06 15:27:01

+0

我明白你在说什么。而且,为了让所有的绘图都在像素上,可以简单地将(0.5,0.5)加到每个坐标上吗?这确实使得给出的例子看起来是正确的。但是,在实践中,我不是绘制矩形,而是绘制复杂的多边形。在这种情况下,这种简单的转变并不能解决问题,因此必须有更多的转变。 – typewriter 2013-03-06 16:47:36