2010-11-16 6 views
3

Le code suivant dessiner une ellipse sur une image et remplir cette ellipse avec la couleur tomateGraphics .NET - la création d'une ellipse avec un fond transparent

string imageWithTransEllipsePathToSaveTo = "~/Images/imageTest.png"; 
Graphics g = Graphics.FromImage(sourceImage); 

g.FillEllipse(Brushes.Tomato, 50, 50, 200, 200); 

sourceImage.Save(Server.MapPath(imageWithTransEllipsePathToSaveTo), ImageFormat.Png); 

Si je change le pinceau transparent, il ne sera évidemment pas montrer parce que l'ellipse sera transparente et l'image ci-dessous montrera.

Comment définir l'arrière-plan de l'ellipse pour qu'elle soit transparente afin que l'image contienne un point transparent?

EDIT:

Désolé pour la confusion, mais comme ça ... alt text

+0

Je crains que ce soit * très * peu clair. Pouvez-vous ajouter une image pour que nous puissions voir quel devrait être le résultat final? – egrunin

+0

@egrunin - oui Je ne suis pas clair mais ce que je pense que j'essaie de dire est de créer un point transparent sur une image sans rien en dessous. –

+0

Avez-vous seulement accès à GDI, ou est-ce que WPF est une possibilité? – Eilistraee

Répondre

2

Ceci est ma deuxième réponse et fonctionne avec une image au lieu d'une brosse de couleur. Malheureusement, il n'y a pas de RadialImageBrush (connu de moi). J'ai inclus le code pour enregistrer l'image sur le disque, et inclus usings pour vous assurer d'importer les composants corrects. Cela utilise WPF mais cela devrait fonctionner dans le cadre d'une bibliothèque ou d'une application de console.

using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System; 
using System.Windows.Controls; 
using System.Windows; 
using System.Windows.Shapes; 
namespace WpfApplication30 
{ 
    class ImageEditor 
    { 
     public static void processImage(string loc) 
     { 
      ImageSource ic = new BitmapImage(new Uri(loc, UriKind.Relative)); 
      ImageBrush brush = new ImageBrush(ic); 
      Path p = new Path(); 
      p.Fill = brush; 
      CombinedGeometry cb = new CombinedGeometry(); 
      cb.GeometryCombineMode = GeometryCombineMode.Exclude; 
      EllipseGeometry ellipse = new EllipseGeometry(new Point(50, 50), 5, 5); 
      RectangleGeometry rect = new RectangleGeometry(new Rect(new Size(100, 100))); 
      cb.Geometry1 = rect; 
      cb.Geometry2 = ellipse; 
      p.Data = cb; 

      Canvas inkCanvas1 = new Canvas(); 
      inkCanvas1.Children.Add(p); 
      inkCanvas1.Height = 96; 
      inkCanvas1.Width = 96; 

      inkCanvas1.Measure(new Size(96, 96)); 
      inkCanvas1.Arrange(new Rect(new Size(96, 96))); 
      RenderTargetBitmap targetBitmap = 
    new RenderTargetBitmap((int)inkCanvas1.ActualWidth, 
          (int)inkCanvas1.ActualHeight, 
          96d, 96d, 
          PixelFormats.Default); 
      targetBitmap.Render(inkCanvas1); 

      using (System.IO.FileStream outStream = new System.IO.FileStream(loc.Replace(".png","Copy.png"), System.IO.FileMode.Create)) 
      { 
       PngBitmapEncoder encoder = new PngBitmapEncoder(); 
       encoder.Frames.Add(BitmapFrame.Create(targetBitmap)); 
       encoder.Save(outStream); 
      } 
     } 
    } 
} 

Voici le résultat: alt text

+0

super trucs merci! –

0

Vous devez créer un pinceau en utilisant une couleur semi-transparente.

Vous faites cela avec Color.FromArgb(alpha, r, g, b), où alpha définit l'opacité.

Example copied from MSDN:

public void FromArgb1(PaintEventArgs e) 
{ 
    Graphics  g = e.Graphics; 

    // Transparent red, green, and blue brushes. 
    SolidBrush trnsRedBrush = new SolidBrush(Color.FromArgb(120, 255, 0, 0)); 
    SolidBrush trnsGreenBrush = new SolidBrush(Color.FromArgb(120, 0, 255, 0)); 
    SolidBrush trnsBlueBrush = new SolidBrush(Color.FromArgb(120, 0, 0, 255)); 

    // Base and height of the triangle that is used to position the 
    // circles. Each vertex of the triangle is at the center of one of the 
    // 3 circles. The base is equal to the diameter of the circles. 
    float triBase = 100; 
    float triHeight = (float)Math.Sqrt(3*(triBase*triBase)/4); 

    // Coordinates of first circle's bounding rectangle. 
    float x1 = 40; 
    float y1 = 40; 

    // Fill 3 over-lapping circles. Each circle is a different color. 
    g.FillEllipse(trnsRedBrush, x1, y1, 2*triHeight, 2*triHeight); 
    g.FillEllipse(trnsGreenBrush, x1 + triBase/2, y1 + triHeight, 
     2*triHeight, 2*triHeight); 
    g.FillEllipse(trnsBlueBrush, x1 + triBase, y1, 2*triHeight, 2*triHeight); 
} 
+0

Cela va peindre 3 cercles qui se chevauchent mais je ne pense pas avoir un "point transparent". –

+0

Je sais. Vous et moi interprétons la question différemment; Je n'ai aucune idée de ce qu'il veut vraiment. – egrunin

+0

@egrunin et @Greg - Greg est peut-être correct d'avoir mal formulé cette question (j'ai cherché mais je n'ai pas reçu le pointeur vers une solution) J'aimerais vraiment créer une tache transparente avec rien en dessous –

1

Vous devez utiliser un RadialGradientBrush:

RadialGradientBrush b = new RadialGradientBrush(); 
b.GradientOrigin = new Point(0.5, 0.5); 
b.Center = new Point(0.5, 0.5); 
b.RadiusX = 0.5; 
b.RadiusY = 0.5; 
b.GradientStops.Add(new GradientStop(Colors.Transparent,0)); 
b.GradientStops.Add(new GradientStop(Colors.Transparent,0.25)); 
b.GradientStops.Add(new GradientStop(Colors.Tomato, 0.25)); 
g.FillEllipse(b, 50, 50, 200, 200); 

alt text

+0

fait partie de WPF? Puis-je l'utiliser dans le cadre du prétraitement d'une image sur un site Web? –

+0

Oui, cela fait partie de WPF. Si vous remplacez votre ligne g.FillEllipse() par mon code ci-dessus, la méthode SourceImage.Save() doit enregistrer l'image sur le disque afin qu'elle soit prête pour le téléchargement sur le Web. –