3

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

我正在计算贝塞尔点,然后使用 DrawImage 在每个点上绘制自定义图像画笔进行绘画。

但是,我并没有完全得到我希望的结果——产生的曲线在它弯曲的点上并不平滑(注意 Y 坐标增加/减少了 1px):

波涛汹涌的曲线

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

曲线优美

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

我基本上是这样做的:

        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();
            }
        }

谢谢!

4

2 回答 2

2

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

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

于 2011-09-26T21:25:29.210 回答
1

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

一个更简单但没有贝塞尔曲线的例子是使用DrawLines方法。就像是:

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

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

于 2011-09-26T21:19:43.133 回答