我正在尝试使用抗锯齿,但我不知道它为什么不起作用:
{
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));
}
答案 0 :(得分:4)
首先应该注意Graphics
对象不包含任何图形;它是一个工具,可让您绘制到相关的位图,包括控件的表面。因此,更改其任何属性(例如SmoothingMode
仅>会影响您从 > 之后绘制的图形 ..
圈子当然会有抗锯齿像素如果你会在将SmoothingMode
设置为默认值{{1>转到None
。
Line 垂直,因此除了 之外,它不需要抗锯齿。但是如果你倾斜它或将其移动到非整数位置就会显示反锯齿!
让我们稍微修改你的代码并仔细查看结果:
AntiAlias
较小的圆圈有许多灰色像素,甚至原始绿线也有较浅的顶端。这两条新线现在完全消除锯齿,一条是因为它是倾斜的,另一条是因为它位于像素之间。
顺便说一下:如果它已开启,当<{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
对象..