【问题标题】:Adding antialiasing添加抗锯齿
【发布时间】:2016-03-19 18:14:42
【问题描述】:

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

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

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    首先要注意Graphics 对象不包含任何图形;它是一个工具,可让您在相关位图(包括控件表面)上绘图。因此,更改其任何属性,例如 SmoothingMode 会影响您从那时起绘制的图形,而不影响您之前绘制的任何内容。

    圆圈肯定有抗锯齿像素如果你会在SmoothingMode从默认None设置为@之后绘制它987654330@.

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

    让我们稍微修改一下你的代码,仔细看看结果:

    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 来更改此行为:

    此属性决定 Pen 如何绘制闭合曲线和 多边形。 PenAlignment 枚举指定了五个值; 然而,只有两个值——Center 和 Inset——会改变外观 的画线。 Center 是该属性的默认值,并且 指定画笔的宽度以 曲线或多边形。此属性的 Inset 值指定 笔的宽度在曲线或多边形的轮廓内。这 其他三个值,Right、Left 和 Outset,将生成一支笔 居中。

    将对齐设置为 Inset 的 Pen 将产生不可靠的 结果,有时在插入位置绘制,有时在 居中位置。此外,内嵌笔不能用于绘制复合 线,不能用三角形破折号画虚线。

    PS:问题不在于如何正确地绘制,所以请注意,您永远不应该使用@来绘制987654337@,因为这始终只会导致非持久图形。相反,您需要使用Paint 事件及其e.Graphics 对象..

    【讨论】:

      猜你喜欢
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 2011-07-05
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多