我正在使用C#WinForms制作绘画程序。但是,我正在使用Graphics.DrawLine方法,当我移动鼠标时它可以正常工作。然而,它绘制了一条有缺陷的线(而不是“完整”线)。这就是我的意思:
左边是应该的样子。 正确的是你快速划线时的样子。我希望绘制的线条是完美的,而不是像图片中那样有缺陷。我该怎么做?这是我的代码。
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的画笔一样的东西。
答案 0 :(得分:2)
问题是你要绘制很多宽度较大的小线条。 线条有直边,这就是为什么你在线条之间得到一些空白像素的原因。
我建议您为Pen
对象使用圆形开始和结束大写,如下所示:
myPen.StartCap = System.Drawing.Drawing2D.LineCap.Round;
myPen.EndCap = System.Drawing.Drawing2D.LineCap.Round;
以下是它的外观: 蓝线是您的代码,红线是使用圆帽绘制的:
顺便说一句:打开抗锯齿(SmoothingMode)并不能解决问题。你仍然可以看到一些缺失的像素,尽管它们不太明显:
答案 1 :(得分:0)
我认为你需要尝试抗锯齿
像这样: Graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
答案 2 :(得分:0)
您需要在绘制前设置平滑模式
Graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
这将平滑线条的角落,查看AA线和非AA线之间的差异