Benutzer mit den meisten Antworten
In einer Ellipse eine Image einbauen

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 RoutineModule 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
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
- Bearbeitet Elmar BoyeEditor Samstag, 1. Mai 2010 17:25 Ellipse -> Kreis
- Als Antwort vorgeschlagen Thorsten DörflerModerator Samstag, 1. Mai 2010 19:29
- Als Antwort markiert Bernd Schlepütz Samstag, 1. Mai 2010 22:08
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
- Bearbeitet Elmar BoyeEditor Samstag, 1. Mai 2010 17:25 Ellipse -> Kreis
- Als Antwort vorgeschlagen Thorsten DörflerModerator Samstag, 1. Mai 2010 19:29
- Als Antwort markiert Bernd Schlepütz Samstag, 1. Mai 2010 22:08
-
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
-
Hallo Bernd,
schau Dir dazu die anderen Methoden wie TranslateTransform an,
die die Graphics Klasse anbietet.Gruß Elmar
-
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
-
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.
-
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