Создание прозрачного угла PNG в .net - PullRequest
2 голосов
/ 11 июня 2009

Как часть пользовательской библиотеки .net мне нужно создать угловые PNG-изображения, чтобы выровнять их по углам DIV, чтобы получить закругленные углы.

Я думал, что смогу создать динамический угол, выполнив следующее:

  • Создание растрового изображения (скажем, 25 x 25)
  • Залейте фон зеленым цветом (цвет за пределами DIV, для которого мы их создаем)
  • Вызовите FillEllipse () и создайте круг размером 50 x 50, 25% которого перекрывается с растровым изображением 25 x 25
  • Наконец, вызовите DrawEllipse () с теми же координатами, чтобы нарисовать границу

Это хорошо работает и создает угловое изображение.

Проблема в том, что я хочу, чтобы цвет вызывался FillEllipse () , чтобы он был Color.Transparent . Это позволяет DIV иметь цвет фона, назначенный с помощью стиля.

Однако, поскольку FillEllpise () создает прозрачный круг на цветном фоне, ничего не появится.

В итоге: Как я могу пробить прозрачное отверстие?

Я думал, что ExcludeClip () поможет, но это, похоже, имеет дело только с Recentangles.

Ответы [ 4 ]

2 голосов
/ 11 июня 2009

Это работает:

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 голос
/ 11 июня 2009

Вы можете нарисовать обратное, используя путь.

Этот пример кода рисует прозрачную четверть круга на черном фоне:

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

Если вместо черного фона требуется растровый фон, используйте путь, чтобы обрезать рисунок растрового изображения, а не заполнить область сплошным цветом.

0 голосов
/ 11 июня 2009

Может, попробовать наоборот? Сделать фон прозрачным, нарисовать границу, а затем залить угол зеленым цветом?

0 голосов
/ 11 июня 2009

Лучше всего было бы позвонить MakeTransparent на полученном растровом изображении, чтобы "пробить" все, что вы нарисовали с помощью FillEllipse.

...