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

    {
        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);


c# - 添加抗锯齿-LMLPHP c# - 添加抗锯齿-LMLPHP

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

顺便说一句:如果将其打开,当Pen.Width为偶数或非整数时,您还将看到抗锯齿。后者的原因应该很明显。前者来自PenAlignment属性。其默认的Center尝试使笔居中,但不在笔芯边界处,而是在坐标像素的中心处。因此,只有不均匀的宽度将完全填充像素,而不会引起抗锯齿。对于闭合形状,可以通过将Pen.Alignment更改为Inset来更改此行为:


  此属性确定笔如何绘制闭合曲线并
  多边形。 PenAlignment枚举指定五个值。
  但是,只有两个值(居中和插入)会改变外观
  画线。 Center是此属性的默认值,
  指定笔的宽度以笔尖的轮廓为中心
  曲线或多边形。此属性的Inset值指定
  笔的宽度在曲线或多边形的轮廓内。的
  其他三个值(右,左和偏移)将导致一支笔
  居中。
  
  将其对齐方式设置为“插入”的笔会产生不可靠的结果
  结果,有时绘制在插入位置,有时绘制在
  居中位置。此外,不能使用插入笔绘制化合物
  线,不能使用三角形破折号绘制虚线。


PS:问题不在于如何正确绘制,所以让我注意一下,您永远都不应该使用control.CreateGraphics进行绘制,因为这只会导致非永久性图形。相反,您需要使用Paint事件及其e.Graphics对象。

关于c# - 添加抗锯齿,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36094055/

10-13 06:47