在.net中创建透明角落PNG

时间:2009-06-11 10:53:01

标签: .net css gdi+

作为UI .net库的一部分,我需要创建角落PNG图像以对齐DIV的角落,以便为其提供圆角。

我认为我可以通过以下方式创建一个动态角落:

  • 创建一个位图(比方说25 x 25)
  • 填充背景绿色(我们正在创建这些颜色的DIV之外的颜色)
  • 调用 FillEllipse()并创建一个50 x 50的圆圈,其中25%重叠到25 x 25位图中
  • 最后用相同的坐标调用 DrawEllipse()来绘制边框

效果很好,可以创建角落图像。

问题是我希望 FillEllipse()调用的颜色为 Color.Transparent 。这样,DIV可以通过样式分配背景颜色。

但是因为 FillEllpise()在彩色背景上创建一个透明圆圈,所以不会出现任何内容。

总结:如何打出透明孔?

我认为 ExcludeClip()会有所帮助,但这似乎只能处理Recentangles。

4 个答案:

答案 0 :(得分:2)

这有效:

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)

答案 1 :(得分:1)

您可以使用路径绘制反转。

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

  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);

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

答案 2 :(得分:0)

您最好的选择可能是在生成的位图上调用MakeTransparent以“打出”您使用FillEllipse绘制的任何内容。

答案 3 :(得分:0)

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