none
In einer Ellipse eine Image einbauen RRS feed

  • Frage

  • Hallo Zusammen,

    ich habe mir eine Uhr mit DGI gebaut. Ich zeichne eine Ellipse und String und schon ist die Uhr fertig. Hat eigenlich alles gut funktioniert.
    Nun mötche ich ich ein Image in die Mitte der Uhr legen. Natürlich soll das Image dann Rund sein.

    Nun habe ich im Netz eine Funktion gefunden die ein Objekt abrunden kann. Das Teil habe ich mir so umgebaut das nicht nur die Ecken gerunden werden sonern das gaze Objekt rund wird. Damit kann ich mein Control Kreisrund bekommen. Es gibt nur einen Nachteil. Das die Uhr einen schmalen Rand besitzt, wird dieser dann leicht verzerrt. Das sieht nicht besonders aus.
    Hier mal die Routine

    Module RoundIt
      Sub abrunden(ByVal was As Object, ByVal x As Integer, ByVal y As Integer, _
     ByVal width As Integer, ByVal height As Integer, _
     ByVal radius As Integer)
    
        Dim gp As System.Drawing.Drawing2D.GraphicsPath = New System.Drawing.Drawing2D.GraphicsPath()
        gp.AddLine(x + radius, y, x + width - radius, y)
        gp.AddArc(x + width - radius, y, radius, radius, 270, 90)
        gp.AddLine(x + width, y + radius, x + width, y + height - radius)
        gp.AddArc(x + width - radius, y + height - radius, radius, radius, 0, 90)
        gp.AddLine(x + width - radius, y + height, x + radius, y + height)
        gp.AddArc(x, y + height - radius, radius, radius, 90, 90)
        gp.AddLine(x, y + height - radius, x, y + radius)
        gp.AddArc(x, y, radius, radius, 180, 90)
        gp.CloseFigure()
    
        was.region = New System.Drawing.Region(gp)
        gp.Dispose()
      End Sub
    End Module
    

    Es mus aber doch eine möglichkeit geben, ein Bitmap rund zu beschneiden und das Panel zu zeichenn !?

    Wo muss ich anfange zu suchen ?
    Ich bin Neuling in sachen GDI.

     

    vielen lieben dank

    Bernd

    Samstag, 1. Mai 2010 14:33

Antworten

  • Hallo Bernd,

    das funktioniert, wenn Du den Pfad als Clip-Bereich festlegst, z. B.:

     

      ' Alte Bitmap freigeben
      If PictureBox1.Image IsNot Nothing Then
       PictureBox1.Image.Dispose()
      End If
    
      ' Neue Bitmap erzeugen 
      Dim imageBitmap As New Bitmap(PictureBox1.Width, PictureBox1.Height)
    
      ' Zur Verdeutlichung Hintergrund andere Farbe
      Using g = Graphics.FromImage(imageBitmap)
    
       ' Alles löschen
       g.Clear(Color.Red)
    
       ' Einige Optionen um die Ausgabe zu verbessern
       g.CompositingQuality = CompositingQuality.HighQuality
       g.InterpolationMode = InterpolationMode.HighQualityBicubic
       g.SmoothingMode = SmoothingMode.AntiAlias
    
       ' Einen Pfad anlegen
       Using path As New GraphicsPath
        Dim imageRectangle As New Rectangle(10, 10, PictureBox1.Width - 20, PictureBox1.Height - 20)
    
        path.AddEllipse(imageRectangle)
    
        ' in eine Region umwandeln und als Clip-Bereich festlegen
        Using imageRegion As New Region(path)
         g.SetClip(imageRegion, CombineMode.Replace)
    
         ' Graphik zeichnen
         g.DrawImage(meinBild, imageRectangle)
    
         Using p As New Pen(Color.Yellow, 2)
          g.TranslateClip(2, 2)
          g.DrawEllipse(p, imageRectangle)
         End Using
        End Using
       End Using
      End Using
      ' In PictureBox anzeigen
      PictureBox1.Image = imageBitmap

    ... weitere Spielereien sind denkbar ;-)

    Kleiner Nachtrag: Eine Ellipse aus einem Quadrat (Rechteck mit gleicher Höhe und Breite)
    gezeichnet ergibt einen Kreis, was das Malen eines Kreises vereinfacht.

    Gruß Elmar

    Samstag, 1. Mai 2010 17:20
    Beantworter

Alle Antworten

  • Hallo Bernd,

    das funktioniert, wenn Du den Pfad als Clip-Bereich festlegst, z. B.:

     

      ' Alte Bitmap freigeben
      If PictureBox1.Image IsNot Nothing Then
       PictureBox1.Image.Dispose()
      End If
    
      ' Neue Bitmap erzeugen 
      Dim imageBitmap As New Bitmap(PictureBox1.Width, PictureBox1.Height)
    
      ' Zur Verdeutlichung Hintergrund andere Farbe
      Using g = Graphics.FromImage(imageBitmap)
    
       ' Alles löschen
       g.Clear(Color.Red)
    
       ' Einige Optionen um die Ausgabe zu verbessern
       g.CompositingQuality = CompositingQuality.HighQuality
       g.InterpolationMode = InterpolationMode.HighQualityBicubic
       g.SmoothingMode = SmoothingMode.AntiAlias
    
       ' Einen Pfad anlegen
       Using path As New GraphicsPath
        Dim imageRectangle As New Rectangle(10, 10, PictureBox1.Width - 20, PictureBox1.Height - 20)
    
        path.AddEllipse(imageRectangle)
    
        ' in eine Region umwandeln und als Clip-Bereich festlegen
        Using imageRegion As New Region(path)
         g.SetClip(imageRegion, CombineMode.Replace)
    
         ' Graphik zeichnen
         g.DrawImage(meinBild, imageRectangle)
    
         Using p As New Pen(Color.Yellow, 2)
          g.TranslateClip(2, 2)
          g.DrawEllipse(p, imageRectangle)
         End Using
        End Using
       End Using
      End Using
      ' In PictureBox anzeigen
      PictureBox1.Image = imageBitmap

    ... weitere Spielereien sind denkbar ;-)

    Kleiner Nachtrag: Eine Ellipse aus einem Quadrat (Rechteck mit gleicher Höhe und Breite)
    gezeichnet ergibt einen Kreis, was das Malen eines Kreises vereinfacht.

    Gruß Elmar

    Samstag, 1. Mai 2010 17:20
    Beantworter
  • Hallo Elmar,

    Wow. Auf die Lösung habe ich gwartet. Ich werde das testen.

    Gruß Ellen

    Samstag, 1. Mai 2010 18:05
  • Hallo Ellen,

    ich hatte dafür das PictureBox Beispiel "mißbraucht", das wir vor einiger Zeit hatten.
    Der Code steht dort im BildErzeugen...

    Gruß Elmar

    Samstag, 1. Mai 2010 19:17
    Beantworter
  • Ok super,

     

    ich habe daran rumgebastelt und getestet. Ist eigentlich sehr einfach.
    Jetzt muss ich noch weiter Basteln. Ich muss den MittelPunkt des Bildes verschieben können.
    Damit später in der Uhr das Bild die gewünschte Position hat.
    Da habe ich aber schon eine Lösung mit Region gebastelt.

     

    vielen lieben dank

    bernd

    Samstag, 1. Mai 2010 21:07
  • Hallo Bernd,

    schau Dir dazu die anderen Methoden wie TranslateTransform an,
    die die Graphics Klasse anbietet.

    Gruß Elmar

    Samstag, 1. Mai 2010 22:59
    Beantworter
  • Hallo Elmar,

    meinst du jetzt das verschieben des Bild him Hintergrund ? Dazu kann ich TranslateTransform nutzen ?
    weil ich möchte nicht wieder ein bis zweiteag lesen und suchen !

    Sonntag, 2. Mai 2010 07:17
  • Hallo Bernd,

    da ich nicht weiß, wie Dein Bild und der Rest zusammenhängt,
    kann ich da keine abschließende Antwort geben.

    Ganz ohne Probieren wird es vermutlich nicht gehen.
    Du erinnerst Dich vielleicht noch an den Link den ich Dir mal gegeben hatte,
    einige Seiten weiter: http://www.informit.com/articles/article.aspx?p=102607&seqNum=10
    wird gezeigt, wie Aktionen gekoppelt werden können.

    Gruß Elmar

    Sonntag, 2. Mai 2010 08:45
    Beantworter
  • Ja sorry,

    ich habe es gebastelt. Das Bild ist jetzt Rund. Befindet sich im Hintergrund der Runden Uhr und wird beim verändern der Uhrengröße auch mit verkleinert bzw. vergrößert.
    Was jetzt noch nicht so suaber ist, ist der Rand. er wird nun leicht Stufenförmig dargestellt.
    Dafür fällt mir aber auch noch etwas ein.

    So nun höre ich auf zu nerven.
    Ich bastel jeztz schon über zwei Wochen an dieser Uhr und werde verutlich noch weitere Wochen dran basteln.
    Und so soll es sein.

    vielen lieben dank

    Bernd

    fals es dich Interessiert, hier ein TEilergebnis meines Vorhabens.

    http://supercontrol.pagedeluxe.de/

    Sonntag, 2. Mai 2010 09:30
  • Was jetzt noch nicht so suaber ist, ist der Rand. er wird nun leicht Stufenförmig dargestellt.
    Dafür fällt mir aber auch noch etwas ein.


    Hallo,

    Ich glaube nicht dass Dir dazu was einfallen dürfte, immer hin hast Du es mit einer Region zu tun. Ein Teil einer Region ist da oder nicht. Du kannst nur versuchen das Dein gebettetes Image an den der Rändern zum Hintergrund "Smooth" übergeht. Änderst Du dann aber mal den Hindergrund werden die Stufen sofort wieder "sichtbar".

    Ich weiß nicht wie Du Dein Control aufgebaut hast, gehe aber mal von einer PictureBox oder ähnlichem aus, damit wird es grundsätzlich schwer fließende Übergänge zu erzeugen.

    --

    Gruß Scotty

    Mittwoch, 5. Mai 2010 11:19