C# 添加抗锯齿

C# 添加抗锯齿,c#,winforms,C#,Winforms,我正在尝试使用抗锯齿,但我不知道为什么它不起作用: { Pen pen = new Pen(Color.Black, 3); Pen r = new Pen(Color.YellowGreen, 3); Graphics b = panel2.CreateGraphics(); b.DrawEllipse(pen, 6, 0, 90, 90); b.SmoothingMode = SmoothingMode.

我正在尝试使用抗锯齿,但我不知道为什么它不起作用:

    {
        Pen pen = new Pen(Color.Black, 3);
        Pen r = new Pen(Color.YellowGreen, 3);
        Graphics b = panel2.CreateGraphics();
        b.DrawEllipse(pen, 6, 0, 90, 90);
        b.SmoothingMode = SmoothingMode.AntiAlias;
        b.DrawLine(r, new Point(50, 90), new Point(50, 0));
    }

首先应该注意,
图形
对象不包含任何图形;它是一个工具,可用于绘制相关位图,包括控件的曲面。因此,更改其任何属性,如
平滑模式
,只会影响从那时起绘制的图形,而不会影响以前绘制的任何图形

如果
平滑模式
从默认的
设置为
抗锯齿
,则圆肯定会具有抗锯齿像素

这条线是垂直的,所以它不需要抗锯齿,除了在它的末端,那里有一些。但是,如果将其倾斜或移动到非整数位置,将显示抗锯齿

让我们稍微修改一下代码并仔细查看结果:

Pen pen = new Pen(Color.Black, 3);
Pen r = new Pen(Color.YellowGreen, 3);
Graphics b = panel2.CreateGraphics();
b.DrawEllipse(pen, 6, 6, 90, 90);
b.SmoothingMode = SmoothingMode.AntiAlias;
b.DrawLine(r, new Point(50, 90), new Point(50, 0));

b.DrawLine(r, new Point(60, 90), new Point(70, 0));
b.DrawLine(r, new PointF(40.5f, 90), new PointF(40.5f, 0));
b.DrawEllipse(pen, 6, 6, 30, 30);

较小的圆有许多灰色像素,甚至原始绿线的顶端也较亮。这两条新线现在完全消除了锯齿,一条是因为它倾斜,另一条是因为它位于像素之间

顺便说一句:如果它被打开,当你的
笔的宽度
偶数或是非整数时,你也将看到反序列化。后者的原因应该是显而易见的;前者来自于财产。默认的
Center
尝试使笔居中,但不是在像素边界,而是在坐标像素的中心。因此,只有不均匀的宽度将完全填充像素,而不会导致抗锯齿。对于闭合形状,您可以通过将
画笔对齐
更改为
插入
来更改此行为:

此属性确定画笔绘制闭合曲线和曲线的方式 多边形。PenAlignment枚举指定五个值; 但是,只有两个值“居中”和“插入”将更改外观 指一条划出的线。“中心”是此属性的默认值,并且 指定画笔的宽度以画笔的轮廓为中心 曲线或多边形。此属性的Inset值指定 笔的宽度在曲线或多边形的轮廓内。这个 其他三个值(Right、Left和start)将生成 是居中的

将对齐设置为“插入”的笔将产生不可靠的结果 结果,有时在插入位置绘制,有时在 居中位置。此外,插入笔不能用于绘制合成图 直线,不能使用三角形虚线帽绘制虚线

PS:问题不在于如何正确地绘制,所以我要指出的是,您永远不应该使用
控件来绘制图形。创建图形
,因为这只会导致非持久性图形。相反,您需要使用
Paint
事件及其
e.Graphics
对象