首先需要注意的是,
Graphics
对象并不包含任何图形;它是一个工具,允许你在相关位图(包括控件的表面)上绘制。因此更改它的任何属性(如
SmoothingMode
)只会影响之后绘制的图形,而不会影响之前绘制的任何内容。
如果你在将
SmoothingMode
从默认值
None
更改为
AntiAlias
后绘制圆形,那么它肯定会有抗锯齿像素。
该直线是垂直的,因此除了端点处存在一些外,它不需要抗锯齿。但是如果你倾斜或将其移动到非整数位置,则会显示出抗锯齿效果!
让我们稍微修改一下你的代码,仔细观察结果:
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);
![enter image description here](https://istack.dev59.com/X1OfB.webp)
![enter image description here](https://istack.dev59.com/xNpPP.webp)
小圆圈有许多灰色像素,甚至原始的绿线也有一个较浅的顶端。两条新线现在完全反锯齿化,一条是因为它倾斜了,另一条是因为它处于“像素之间”的位置。
顺便说一下:如果打开,当Pen.Width
为偶数或者是非整数时,您也会看到反锯齿效果。后者的原因应该很明显;前者来自PenAlignment
属性。它的默认值Center
尝试将笔置于中心位置,但不是在像素边界处而是在坐标像素的中心位置。因此,只有奇数的宽度才能完全填充像素并且不会造成反锯齿效果。对于封闭形状,您可以通过将Pen.Alignment
更改为Inset
来改变此行为:
该属性确定Pen如何绘制封闭曲线和多边形。PenAlignment枚举指定了五个值;然而,只有两个值 - Center和Inset - 会改变绘制线的外观。Center是这个属性的默认值,指定笔的宽度置于曲线或多边形的轮廓线上。该属性的Inset值指定笔的宽度在曲线或多边形的轮廓线内部。其他三个值,Right、Left和Outset,将导致笔居中。
将其对齐设置为Inset的Pen将产生不可靠的结果,有时会在插入位置绘制,有时会在中心位置绘制。此外,插入笔不能用于绘制复合线,并且不能使用Triangle虚线帽绘制虚线。
PS:该问题不是关于如何进行正确绘制的,所以让我注意一下,您永远不应该使用control.CreateGraphics
进行绘制,因为这总是只会得到非持久性图形。而是需要使用Paint
事件及其e.Graphics
对象。