用相同的透明度绘制重叠线

时间:2019-01-02 12:22:57

标签: c# graphics gdi+

我大致有这样的逻辑:

Bitmap bmp = ....
Pen pen = new Pen(Color.FromArgb(125, 0, 0, 255), 15);
var graphics = Graphics.FromImage(bmp);
graphics.DrawLines(pen, points1);
graphics.DrawLines(pen, points2);

问题是,points1和points2包含一些重叠的线段。

如果我画这条线,则重叠部分的颜色与其余部分不同,这是由于相同线段的混合(首先是1与背景混合,然后2与已经混合1与背景混合)。是否有办法实现重叠部分与单个不重叠段的颜色相同的效果?

1 个答案:

答案 0 :(得分:4)

DrawLines在这种情况下将不起作用,因为它只会在行中绘制已连接的线。

您需要使用GraphicsPath将行集添加到一个 StartFigure,以分隔这两个集。

示例,左边Drawline,右边DrawPath

enter image description here

这是这两个代码:

using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
..
Pen pen = new Pen(Color.FromArgb(125, 0, 0, 255), 15)
   { LineJoin = LineJoin.Round };
var graphics = Graphics.FromImage(bmp);
graphics.Clear(Color.White);
graphics.DrawLines(pen, points1);
graphics.DrawLines(pen, points2);
bmp.Save("D:\\__x19DL", ImageFormat.Png);

graphics.Clear(Color.White);
using (GraphicsPath gp = new GraphicsPath())
{
    gp.AddLines(points1);
    gp.StartFigure();
    gp.AddLines(points2);
    graphics.DrawPath(pen, gp);
    bmp.Save("D:\\__x19GP", ImageFormat.Png);
}

不要忘记DisposePen对象中的Graphics,或者最好将它们放在using子句中!