我正在尝试使用抗锯齿,但是我不知道为什么它不起作用:
{
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));
}
最佳答案
首先,应注意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);
较小的圆圈具有许多灰色像素,甚至原始的绿线也具有较亮的顶端。现在,两条新线已完全消除锯齿,一条是因为它已倾斜,另一条是因为它位于“像素”之间。
顺便说一句:如果将其打开,当
Pen.Width
为偶数或非整数时,您还将看到抗锯齿。后者的原因应该很明显。前者来自PenAlignment
属性。其默认的Center
尝试使笔居中,但不在笔芯边界处,而是在坐标像素的中心处。因此,只有不均匀的宽度将完全填充像素,而不会引起抗锯齿。对于闭合形状,可以通过将Pen.Alignment
更改为Inset
来更改此行为:此属性确定笔如何绘制闭合曲线并
多边形。 PenAlignment枚举指定五个值。
但是,只有两个值(居中和插入)会改变外观
画线。 Center是此属性的默认值,
指定笔的宽度以笔尖的轮廓为中心
曲线或多边形。此属性的Inset值指定
笔的宽度在曲线或多边形的轮廓内。的
其他三个值(右,左和偏移)将导致一支笔
居中。
将其对齐方式设置为“插入”的笔会产生不可靠的结果
结果,有时绘制在插入位置,有时绘制在
居中位置。此外,不能使用插入笔绘制化合物
线,不能使用三角形破折号绘制虚线。
PS:问题不在于如何正确绘制,所以让我注意一下,您永远都不应该使用
control.CreateGraphics
进行绘制,因为这只会导致非永久性图形。相反,您需要使用Paint
事件及其e.Graphics
对象。关于c# - 添加抗锯齿,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36094055/