添加抗锯齿

时间:2016-03-18 20:55:42

标签: 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.AntiAlias;
        b.DrawLine(r, new Point(50, 90), new Point(50, 0));
    }

1 个答案:

答案 0 :(得分:4)

首先应该注意Graphics对象不包含任何图形;它是一个工具,可让您绘制到相关的位图,包括控件的表面。因此,更改其任何属性(例如SmoothingMode >会影响您从 > 之后绘制的图形 ..

圈子当然有抗锯齿像素如果你会在SmoothingMode设置为默认值{{1>转到None

Line 垂直,因此除了 之外,它不需要抗锯齿。但是如果你倾斜它或将其移动到非整数位置就会显示反锯齿!

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

AntiAlias

enter image description here enter image description here

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

顺便说一下:如果它已开启,当<{1}} 甚至时,您 会看到反对。整数数字。后者的原因应该是显而易见的;前者来自PenAlignment属性。其默认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更改为Center来更改此行为:

  

此属性确定Pen绘制闭合曲线的方式   多边形。 PenAlignment枚举指定五个值;   但是,只有两个值 - 中心和插入 - 将改变外观   画线。 Center是此属性的默认值   指定笔的宽度以中心的轮廓为中心   曲线或多边形。此属性的Inset值指定   笔的宽度位于曲线或多边形的轮廓内。该   其他三个值,Right,Left和Outset,将产生一支笔   是中心。

     

将其对齐设置为Inset的笔将产生不可靠   结果,有时画在插入位置,有时在画面中   中心位置。另外,插入笔不能用于绘制化合物   线条,不能用三角形破折号画线绘制虚线。

PS:问题不在于如何正确地绘制 ,所以我要注意你从不应该使用{ {1}}因为这只会导致非持久性图形。相反,您需要使用Pen.Alignment事件及其Inset对象..