CGContextClip 抗锯齿问题

Posted

技术标签:

【中文标题】CGContextClip 抗锯齿问题【英文标题】:CGContextClip Antialiasing issue 【发布时间】:2014-09-20 15:50:06 【问题描述】:

我在 UIView drawRect 函数中绘制一个形状,该函数涉及剪切路径,然后在后面添加彩色块,以便颜色具有剪切路径的形状。但是,由于某种原因,路径的线条并不顺畅;如果抗锯齿不能正常工作。

CGContextSetStrokeColorWithColor(context, [UIColor clearColor].CGColor);
CGContextSetLineWidth(context, 1.0);
CGContextSetShouldAntialias(context, true);
CGContextSetAllowsAntialiasing(context, true);
CGContextBeginPath (context);
CGContextMoveToPoint(context, xStart, yStart);
for (int i=0; i<points.count; i++) 
        CGContextAddLineToPoint(context, xPoint, yPoint);
    


CGContextAddLineToPoint(context, xStart, yStart );
CGContextClip(context);

CGRect colorRect = CGRectMake(0, 0 , rectWidth, rectHeight);
CGContextSetFillColorWithColor(context, blockColor.CGColor);
CGContextFillRect(context, colorRect);
CGContextRestoreGState(context);

结果应该有平滑的线条,但它会出现锯齿状的可见像素,如下图所示:

知道问题出在哪里以及如何解决吗?

提前致谢

【问题讨论】:

你在画直方图,不是吗? 是的,它是一个直方图 【参考方案1】:

好的。所以,你的代码没有问题。问题是抗锯齿的工作方式有点不同。您绘制一个垂直斜率,期望结果直方图的边缘将被平滑。但实际上抗锯齿并不能平滑生成的图形。它与路径元素(曲线,线条)一一对应。因此,例如,如果你画一个圆,它的边缘会被平滑。

您的问题有一个简单的解决方案:只需创建一条曲线,包围直方图。将其添加到您的上下文中。看起来会更流畅。

抱歉英语不好。

【讨论】:

我将对此进行探索,但您对图表的组成方式有误......那些不是条形或垂直斜率,它们应该是线条,但呈现像像素边界上的条形跨度> 好吧,不管怎样,它们是不同的行。数组中有多少个点?

以上是关于CGContextClip 抗锯齿问题的主要内容,如果未能解决你的问题,请参考以下文章

求教各位QT高手,如何实现抗锯齿的圆形头像

emWin6.x抗锯齿

图形学笔记五 视口变换 光栅化 抗锯齿

是否可以修复抗锯齿 SKShapeNodes 的模糊性?

iOS 8 Safari webgl 没有抗锯齿

JAVA 用drawLine画斜线出现锯齿,如何抗锯齿