我正在尝试在Winforms应用程序示例中绘制一条贝塞尔曲线。
我正在计算bezier点,然后使用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();
}
}
谢谢!
答案 0 :(得分:2)
你可能会得到这个,因为你的points
集合包含Point
类型的结构,它使用Int32
- 因此,你自己量化了你的观点。
尝试使用PointF
代替 - 这允许您在任意位置绘制图像,而不是在整数位置进行量化。
答案 1 :(得分:1)
您实际上并没有使用GDI绘制线条,因此Smoothing和InterpolationMode设置无效。您只需在点阵中的每个点绘制一个图像,因此无法连接这些点或任何类型的抗锯齿。尝试将积分转换为路径并使用g.DrawPath绘制曲线。
一个更简单但更简洁的例子就是使用DrawLines方法。类似的东西:
g.DrawLines(Pens.Blue, points.ToArray());
你甚至不需要DrawLines和DrawPath的循环。 DrawLines就像一个穷人的DrawPath ......