2009-06-11 8 views
2

Dans le cadre d'une bibliothèque UI .net, j'ai besoin de créer des images PNG en coin pour les aligner sur les coins d'un DIV afin de lui donner des coins arrondis.Création d'un coin transparent PNG dans .net

Je pensais que je pouvais créer un coin dynamique en procédant comme suit:

  • Créer une image bitmap (Disons que 25 x 25)
  • Remplir le fond vert (la couleur en dehors de la DIV, nous créons ceux-ci pour)
  • appel FillEllipse() et créer un 50 x 50 cercle, avec 25% de celui-ci qui se chevauchent dans les 25 x 25 bitmap
  • appeler Enfin DrawEllipse() avec th Les mêmes coordonnées pour dessiner la bordure

Cela fonctionne bien et crée une image de coin.

Le problème est que je veux la couleur appelée par FillEllipse() être Color.Transparent. C'est ainsi que le DIV peut avoir une couleur de fond assignée via un style.

Cependant, étant donné que FillEllpise() crée un cercle transparent sur un arrière-plan coloré, rien ne s'affiche.

En résumé: Comment percer un trou transparent?

Je pensais que ExcludeClip() aiderait, mais cela ne semble traiter qu'avec Recentangles.

Répondre

2

Cela fonctionne:

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) 

EDIT: putain, mademoiselle lire la question, donnez-moi une seconde pour changer le code ...

EDIT2: fait, la partie que vous besoin est le chemin graphique:

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) 
+0

Je crois que c'est l'inverse de ce que l'OP veut - l'extérieur serait transparent mais pas l'intérieur. – samjudson

+0

oui, juste ajouté un peu plus de code :) – Pondidum

+0

Une réponse pour les deux sens, très bon;) Merci pour votre réponse Andy –

0

Votre meilleure mise pourrait être d'appeler MakeTransparent sur le bitmap résultant pour «perforer» tout ce que vous avez dessiné avec FillEllipse.

1

Vous pouvez dessiner l'inverse en utilisant un chemin.

Ce code exemple dessine un quart de cercle transparent sur fond noir:

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

Si au lieu d'un fond noir vous voulez un fond bitmap, puis utilisez le chemin pour couper le dessin du bitmap plutôt que de remplir une zone avec une couleur solide.

+0

Cela semble être beaucoup de chemins ajoutés pour 3 lignes ... – Pondidum

+0

Merci MacKenir, j'ai donné Andy la réponse que le code est plus simple. –

+0

Oui, je n'avais jamais utilisé GraphicsPath auparavant, donc il pourrait probablement être plus propre. – mackenir

0

Peut-être essayer l'inverse? Rendre l'arrière-plan transparent, dessiner la bordure, puis remplir le coin avec du vert?

Questions connexes