我正在尝试使用CGContextClip()来做一些绘图,但是我遇到了一些奇怪的抗锯齿问题。问题似乎是填充正在与正在替换的颜色混合,而不是与周围的像素混合。有关问题的详细描述,请参阅图像!
问题示例:
(注意蓝边正在被抗锯齿化)
奇怪的抗锯齿边缘
(边缘应与白色混合,而不是蓝色)
代码:
-(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 :(得分: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%修复此问题,那么将其作为答案发布,我会接受它!