Graphics.DrawLine问题

时间:2014-02-08 17:06:47

标签: c# winforms

我正在使用C#WinForms制作绘画程序。但是,我正在使用Graphics.DrawLine方法,当我移动鼠标时它可以正常工作。然而,它绘制了一条有缺陷的线(而不是“完整”线)。这就是我的意思:

enter image description here

左边是应该的样子。 正确的是你快速划线时的样子。我希望绘制的线条是完美的,而不是像图片中那样有缺陷。我该怎么做?这是我的代码。

Graphics Graphic;
Pen myPen = new Pen(Color.Black, 1);
Point ep = new Point(0, 0);
Point sp = new Point(0, 0);
int k = 0;

private void panelPaint_MouseDown(object sender, MouseEventArgs e)
{
    myPen.Width = (float)numericWidth.Value;
    myPen.Color = pbCurrent.BackColor;

    sp = e.Location;

    if (e.Button == System.Windows.Forms.MouseButtons.Left)
        k = 1;
}

private void panelPaint_MouseMove(object sender, MouseEventArgs e)
{
    if (k == 1)
    {
        ep = e.Location;
        Graphic = panelPaint.CreateGraphics();
        Graphic.DrawLine(myPen, sp, ep);
    }

    sp = ep;
}

private void panelPaint_MouseUp(object sender, MouseEventArgs e)
{
    k = 0;
}

像Windows的画笔一样的东西。

3 个答案:

答案 0 :(得分:2)

问题是你要绘制很多宽度较大的小线条。 线条有直边,这就是为什么你在线条之间得到一些空白像素的原因。

我建议您为Pen对象使用圆形开始和结束大写,如下所示:

myPen.StartCap = System.Drawing.Drawing2D.LineCap.Round;
myPen.EndCap = System.Drawing.Drawing2D.LineCap.Round;

以下是它的外观: 蓝线是您的代码,红线是使用圆帽绘制的:

Sample

顺便说一句:打开抗锯齿(SmoothingMode)并不能解决问题。你仍然可以看到一些缺失的像素,尽管它们不太明显:

Antialiasing sample

答案 1 :(得分:0)

我认为你需要尝试抗锯齿

像这样:

 Graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

答案 2 :(得分:0)

您需要在绘制前设置平滑模式

Graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

这将平滑线条的角落,查看AA线和非AA线之间的差异

enter image description here