使用GDI / Winforms的抗锯齿贝塞尔曲线 - c#.net

时间:2011-09-26 21:16:45

标签: .net gdi antialiasing bezier curve

我正在尝试在Winforms应用程序示例中绘制一条贝塞尔曲线。

我正在计算bezier点,然后使用DrawImage绘制每个点上的自定义图像画笔。

然而,我并没有完全得到我希望得到的结果 - 结果曲线在它弯曲的点处不平滑(注意Y坐标以1px增加/减少):

Choppy curve

以下是使用画笔工具在“photoshop”中快速绘制的“漂亮”曲线的示例:

Nice curve

有谁知道如何实现这种“抗锯齿”?

我基本上是这样做的:

        using(var g = Graphics.FromImage(bitmap))
        {
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            //points - an array with calculated beziere curve points
            //image - the "image brush" that is painted at each curve point
            foreach (var p in points)
            {
                g.DrawImage(image, p);
                g.Flush();
            }
        }

谢谢!

2 个答案:

答案 0 :(得分:2)

你可能会得到这个,因为你的points集合包含Point类型的结构,它使用Int32 - 因此,你自己量化了你的观点。

尝试使用PointF代替 - 这允许您在任意位置绘制图像,而不是在整数位置进行量化。

答案 1 :(得分:1)

您实际上并没有使用GDI绘制线条,因此Smoothing和InterpolationMode设置无效。您只需在点阵中的每个点绘制一个图像,因此无法连接这些点或任何类型的抗锯齿。尝试将积分转换为路径并使用g.DrawPath绘制曲线。

一个更简单但更简洁的例子就是使用DrawLines方法。类似的东西:

g.DrawLines(Pens.Blue, points.ToArray());

你甚至不需要DrawLines和DrawPath的循环。 DrawLines就像一个穷人的DrawPath ......