C#和Alpha掩码中区域的抗锯齿

时间:2016-01-19 09:11:52

标签: c# graphics gdi+ gdi antialiasing

我想在给定的照片上画一个圆环。圆环/环本身应该用透明度绘制。因为没有drawTorus,所以我使用图形路径来获得结果。

到目前为止,这是我的代码:

Image bmp = Bitmap.FromFile(Application.StartupPath + "\\background.jpg");
Graphics g = Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.AntiAlias;

Rectangle r1 = new Rectangle(bmp.Width / 2 - bmp.Height / 2, 0, bmp.Height, bmp.Height);
Rectangle r2 = Rectangle.Inflate(r1, -50, -50);

GraphicsPath p1 = new GraphicsPath();
p1.AddEllipse(r1);
GraphicsPath p2 = new GraphicsPath();
p1.AddEllipse(r2);

Region re = new Region(p1);
re.Xor(p2);

g.FillRegion(new SolidBrush(Color.FromArgb(80,0,0,0)),re);
g.Save();

结果如下: Result image

这个问题是,SmoothingMode被忽略了。你可以在这里看到它:enter image description here

我读过这是因为Regions不受SmoothingMode参数的影响。

但是如何解决呢?

  1. 是否有其他方法可以在没有区域的情况下编写上述代码?
  2. 我读到关于here 的AlphaMasking,但这也行不通,因为它也会影响圆环的透明度。

1 个答案:

答案 0 :(得分:2)

使用FillPath,您的问题应该解决。

GraphicsPath path = new GraphicsPath();
path.AddEllipse(r1);
path.AddEllipse(r2);

using(Brush b = new SolidBrush(Color.FromArgb(80,0,0,0)))
    g.FillPath(b, path);