【问题标题】:Thick Line Drawing problem in C#.NETC#.NET 中的粗线绘制问题
【发布时间】:2011-08-12 17:55:37
【问题描述】:

我想使用 Graphics.Lines() 方法绘制粗线。但看起来 API 有一些错误。如果您尝试使用以下代码呈现用户控件,您会得到看起来很奇怪的图像。我想知道是否有一些平滑模式或类似的东西可以解决这个画线故障。

private void UserControl1_Paint(object sender, PaintEventArgs e)
    {
        int n = 100;
        Point[] points = new Point[n];

        double x = 2;
        int y = 50;

        for (int i = 0; i < n; i++)
        {
            Point p = new Point();
            p.X = 200 + (int)(i * x);
            p.Y = 200 + (int)(Math.Sin(i * 0.2) * y);
            points[i] = p;
        }

        Pen pen = new Pen(new SolidBrush(Color.Blue));
        //Pen pen = new Pen(new LinearGradientBrush(new Point(0, 0), new Point(0, 100), Color.Black, Color.Red));
        pen.Width = 200;
        e.Graphics.DrawLines(pen, points);
    }

【问题讨论】:

  • 你能用截图澄清一下“奇怪”吗?
  • 你为什么用200的宽度?
  • @Michael 正在做某事:制作pen.Width = 1,我想你会得到你想要的。
  • 感谢大家的快速回复。我特别希望我的应用程序支持不同的线宽。

标签: c# graphics system.drawing


【解决方案1】:

您会看到 GDI+ 尝试在行上绘制结束符的效果。这么粗的笔不会有好的结局。关于达芬奇用扫帚画蒙娜丽莎的想象。修复:

        Pen pen = new Pen(new SolidBrush(Color.Blue));
        pen.EndCap = System.Drawing.Drawing2D.LineCap.Square;
        pen.StartCap = System.Drawing.Drawing2D.LineCap.Square;

或者改为绘制一个多边形,以便 GDI+ 更好地了解正面和背面:

        e.Graphics.DrawPolygon(pen, points);

嗯,它看起来不再像魔鬼了。保持线条宽度与线条中的细节成比例。

【讨论】:

    【解决方案2】:

    这是您使用宽度为 200(像素)的笔绘制代码的结果:

    这里的宽度是 2:

    pen width property 通常是像素,但它基于 Graphics 对象的 PageUnit 属性(它本身就是一个 GraphicsUnit 属性)。检查以确保您已将这些值设置为所需的值。

    【讨论】:

    • 这些是我得到的确切结果。 GraphicsUnit 设置为像素。我不希望第一张照片看起来像个魔鬼。我希望它被平滑地绘制。
    • 如果平滑意味着没有参差不齐的边缘,请查看 AntiAliasing,例如:g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;(其中 g 是图形对象)。如果您指的是线条重叠的反转颜色空间(白色间隙),不幸的是这是一个单独的问题。使用您的代码,避免这些间隙的最粗线约为 105 像素。
    • 嘿,J,是的,我的意思是,在粗线区域填充颜色。
    猜你喜欢
    • 2011-08-26
    • 2011-06-01
    • 2012-12-02
    • 1970-01-01
    • 2011-07-28
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多