2014-11-14 111 views
0

我想使用CGContextClip()做了一些拉伸,但是我遇到了一些奇怪的抗锯齿问题。问题似乎是,填充与正在替换的颜色混合在一起,而不是周围的像素。请参阅图像以获得对问题的更好描述!问题的核芯显卡:CGContextClip()边缘不需要怪异抗锯齿

实施例:

enter image description here

(注意,蓝色边缘被正确抗锯齿)

怪异抗锯齿边缘:

enter image description here (边缘应该是与白色混合,不是蓝色)

代码:

-(void) drawRect:(CGRect)rect { 

    CGContextRef c = UIGraphicsGetCurrentContext(); 

    CGContextSaveGState(c); 
    { 

     CGContextBeginPath(c); 
     CGContextAddEllipseInRect(c, CGRectMake(25, 25, 200, 200)); 
     CGContextClosePath(c); 
     CGContextClip(c); 

     CGContextSetFillColorWithColor(c, [UIColor blueColor].CGColor); 
     CGContextFillRect(c, rect); 

     CGContextSetFillColorWithColor(c, [UIColor redColor].CGColor); 
     CGContextFillRect(c, CGRectMake(0, 0, 250, 125)); 

    } 
    CGContextRestoreGState(c); 


} 

如何防止这种怪异的抗锯齿任何想法?我无法禁用它,因为圆形边缘仍然需要抗锯齿!

只是要清楚,这仅仅是一个例子。我试图在一个更加复杂的形状上解决这个问题,在这种情况下,仅仅填充一半剪辑的解决方案是不可能的!

+0

尝试用蓝色填充矩形的一半。红色下面是蓝色,所以CG所做的是正确的...... – QED 2014-11-14 21:22:29

+0

这可能会解决这个问题,但这不是我可以应用于其他任何方法的解决方案!随着更复杂的形状,这是不可能的。对不起,我应该在OP中明确指出,我正在尝试解决这个问题,但我只是为了简单起见而用这个例子来演示它。我将编辑OP。 – Hamish 2014-11-14 21:25:19

+0

另外,这绝对不是正确的行为!如果红色填充没有完全覆盖蓝色背景(即,如果围绕该圆圈有1px的蓝色边缘),但它确实有意义。如果关闭抗锯齿功能,红色将占据整个圆的上半部分 – Hamish 2014-11-14 21:29:06

回答

0

好了,这不100%解决问题,但它通过相当数量的减少怪异抗锯齿。我从this question得到了想法。这个想法是,在绘制之前清除要绘制的区域中的任何先前渲染,方法是将混合模式更改为清除,执行绘图,然后将其切换回正常,然后重新绘制。修改后的代码看起来是这样的:

-(void) drawRect:(CGRect)rect { 

    CGContextRef c = UIGraphicsGetCurrentContext(); 

    CGContextSaveGState(c); 
    { 

     CGContextBeginPath(c); 
     CGContextAddEllipseInRect(c, CGRectMake(25, 25, 200, 200)); 
     CGContextClosePath(c); 
     CGContextClip(c); 

     CGContextSetFillColorWithColor(c, [UIColor blueColor].CGColor); 
     CGContextFillRect(c, CGRectMake(25, 25, 200, 200)); 

     CGContextSetFillColorWithColor(c, [UIColor redColor].CGColor); 
     CGRect r = CGRectMake(0, 0, 250, 125); 

     CGContextSetBlendMode(c, kCGBlendModeClear); 
     CGContextFillRect(c, r); 
     CGContextSetBlendMode(c, kCGBlendModeNormal); 
     CGContextFillRect(c, r); 


    } 
    CGContextRestoreGState(c); 

} 

如果有人想出了一个更好的解决方案,100%修复了这个问题,然后发布它作为一个答案,我会接受!

+0

我看到这是非常古老的,所以你可能已经很长时间了。我是一个新手,与这些东西混在一起,但我注意到你的代码对笔画颜色或线条宽度没有任何作用。是否有可能只是设置这些(颜色匹配的填充,或宽度为0.0)将解决这个问题? – user1272965 2017-07-29 15:01:07