Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#和Alpha掩蔽中区域的抗锯齿_C#_Graphics_Gdi+_Gdi_Antialiasing - Fatal编程技术网

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

C#和Alpha掩蔽中区域的抗锯齿,c#,graphics,gdi+,gdi,antialiasing,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 Rect

我想在给定的图片上画一个圆环。圆环体/环本身应以透明方式绘制。因为没有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();
结果如下所示:

问题是,SmoothingMode被忽略。你可以在这里看到:

我读到这是因为区域不受SmoothingMode参数的影响

但如何修复呢

  • 有没有其他方法来编写上面没有区域的代码
  • 我读过关于字母掩蔽的文章,但这也不起作用,因为它也会影响圆环的透明度

  • 使用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);
    

    不久前我遇到过同样的问题,我将尝试找到我的解决方案。一个区域应该有助于回答问题“这个像素是在该区域内还是在该区域外”,因此只支持是/否回答。它不支持“它位于边缘,因此位于中间内部和中间外部”,从而为您计算这些像素的alpha遮罩提供了空间。然而,这条路是不同的,如果你放弃去一个地区,只处理这条路,你应该能够处理它。@LasseV.Karlsen谢谢你的澄清。我误解了地域的概念,并低估了地域的可能性。谢谢哇!那太容易了。。。我没有想到,fillPath知道它必须填充两个椭圆之间的区域。因此我使用了区域和XOr。它检查不均匀交叉,所以添加第三个圆将再次填充第三个圆。你会找到更多关于它的信息。