Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/38.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
在.net中创建透明的角点PNG_.net_Css_Gdi+ - Fatal编程技术网

在.net中创建透明的角点PNG

在.net中创建透明的角点PNG,.net,css,gdi+,.net,Css,Gdi+,作为UI.net库的一部分,我需要创建角点PNG图像以与DIV的角点对齐,从而使其成为圆角 我认为我可以通过以下操作创建动态角点: 创建位图(例如25 x 25) 填充背景绿色(我们为其创建的DIV外部的颜色) 调用FillEllipse()并创建一个50 x 50的圆,其中25%重叠到25 x 25位图中 最后使用相同的坐标调用drawerlipse(),以绘制边界 这样做效果很好,可以创建一个角点图像 问题是我想将FillEllipse()调用的颜色设置为Color.Transparen

作为UI.net库的一部分,我需要创建角点PNG图像以与DIV的角点对齐,从而使其成为圆角

我认为我可以通过以下操作创建动态角点:

  • 创建位图(例如25 x 25)
  • 填充背景绿色(我们为其创建的DIV外部的颜色)
  • 调用FillEllipse()并创建一个50 x 50的圆,其中25%重叠到25 x 25位图中
  • 最后使用相同的坐标调用drawerlipse(),以绘制边界
这样做效果很好,可以创建一个角点图像

问题是我想将FillEllipse()调用的颜色设置为Color.Transparent。这样,DIV可以通过样式指定背景颜色

但是,由于Filllelpise()正在彩色背景上创建一个透明的圆圈,因此不会显示任何内容

总而言之:我如何打一个透明的洞?

我原以为ExcludeClip()会有帮助,但这似乎只适用于最近的角度。

这是有效的:

Dim bmp As New Bitmap(25, 25)

Using g As Graphics = Graphics.FromImage(bmp)
    g.Clear(Color.Transparent)  'This is the key point'
    g.FillEllipse(Brushes.Red, New Rectangle(0, 0, 50, 50))
    g.DrawEllipse(Pens.Black, New Rectangle(0, 0, 50, 50))
End Using

bmp.Save("C:\a\out.png", Imaging.ImageFormat.Png)
编辑:该死,小姐读了问题,给我一秒钟时间修改代码

EDIT2: 完成后,您需要的部分是图形路径:

Dim bmp As New Bitmap(25, 25)

Using g As Graphics = Graphics.FromImage(bmp)

    Dim gp As New GraphicsPath

    gp.AddLine(0, 0, 25, 0)
    gp.AddArc(New Rectangle(0, 0, 50, 50), -90, -90)
    gp.AddLine(0, 25, 0, 0)


    g.Clear(Color.Transparent)

    g.FillPath(Brushes.Red, gp)
    g.DrawPath(Pens.Black, gp)

End Using

bmp.Save("C:\a\out.png", Imaging.ImageFormat.Png)

最好的方法可能是调用生成的位图来“打孔”使用FillEllipse绘制的任何内容。

您可以使用路径绘制反转

此示例代码在黑色背景上绘制一个透明的四分之一圆:

  graphics.SmoothingMode = SmoothingMode.HighQuality;
  var path = new GraphicsPath();
  int radius = 30;
  path.AddArc(-radius, -radius, radius * 2, radius * 2, 0, 90);
  path.AddLine(0, radius, -radius, radius * 2);
  path.AddLine(-radius, radius * 2, radius * 2, radius * 2);
  path.AddLine(radius * 2, radius * 2, radius * 2, 0);
  path.AddLine(radius*2, 0, radius, -radius);
  path.CloseFigure();
  graphics.FillPath(Brushes.Black, path);

如果您想要位图背景,而不是黑色背景,则使用路径剪裁位图的图形,而不是用纯色填充区域。

也许可以反过来试试?使背景透明,绘制边框,然后用绿色填充角落?

我认为这与OP想要的正好相反-外部透明,但内部不透明。这两种方法都适用,非常好;)谢谢你的回答,我已经给了安迪答案,因为代码更简单。是的,我以前从未使用过GraphicsPath,所以它可能更干净。