Hallöle,
ich habe 2 Bilder, die ich einlese:
var bild1 = Image.FromFile(file1.Text);
file1.Text ist dabei der Pfad und das ganze sieht bei einem 2. Bild fast genau so aus. Nun möchte ich die beiden Bilder so überlagern, dass bild1 als Hintergrund dient und bild2 an einer gewünschten Position davor gelegt wird.
Zb man wählt beide Bilder aus, wählt unten rechts an, dann ist bild1 in der Originalgröße, bild2 wird skaliert und an die gewählte Position verfrachtet.
Prinzipiell klappt das ganze auch schon, allerdings nur mit Speichern des Bildes:
var bild1 = Image.FromFile(file1.Text);
var bild2 = Image.FromFile(file2.Text);
var g = Graphics.FromImage(bild1);
g.DrawImage(bild2, new Rectangle(xpos, ypos, (int)Math.Round(bild2.Width/scaling), (int)Math.Round(bild2.Height/scaling)), 0, 0, bild2.Width, bild2.Height, GraphicsUnit.Pixel, iaPic); //iaPic für Transparenz
g.Dispose();
bild1.Save("temp.png");
var b = new ImageSourceConverter();
ar bild = b.ConvertFromString("temp.png");
image3.Source = (ImageSource) bild;
xpos und ypos sind die Koordianten, wo der (0,0)-Punkt von bild2 liegen soll (klappt auch, scaling ist ein Faktor, der bild2 skaliert.
g legt also das 2. Bild in ein Rechteckt mit gewünschter Größe an die gewünschte Position auf den hintergrund bild1. Das Ergebnis wird dann in der GUI in der Imagebox image3 angezeigt.
Das Problem: Das ganze geht nur ein mal. Danach existiert temp.png schon und wird auch von einem Thread noch verwendet. Es lässt sich nicht überschreiben und auch nicht löschen. Deshalb wollte ich das ganze anders verwalten, also ganz ohne festes Speichern des Bildes. Meist führt das aber dazu, dass man keine ImageSource mehr daraus bekommt und auch keine anzeige.
Am Ende soll es so sein, dass man die 2 Bilder auswählt, per DropDown die Position anwählt und mit nem Slider den Wert von scaling ändern kann. Das Ergebnis soll dann "live" als weiteres Bild in der GUI erschreinen.
Ik hoff ma da kann mir hier wer helfen 😉
MfG
Meine Vermutung, das Bild mittels Dispose wieder freizugeben bevor du es erneut überschreiben kannst bestätigt sich in why does this code lock my files?.
Lg, XXX
Hi JonnyJohnson,
wenn es dir wirklich nur um die Anzeige geht, brauchst du auch nicht die Bilder zu verändern. Es reicht, einfach die Bilder mit Graphics.DrawImage nacheinander auf das Control oder die Form zu zeichnen. Siehe dazu auch [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox)
Christian
Weeks of programming can save you hours of planning
WIe genau bekomme ich sie denn auf das Control?
Ich lege mit g = new Graphics(); meie Malfläche an, dann zeichne ich mit
g.DrawImage(bild1, 0, 0);
g.DrawImage(bild2, xpos, ypos, (int)Math.Round(bild2.Width/scaling), (int)Math.Round(bild2.Height/scaling));
meine beiden Bilder, wie vorher auch schon. Nur was dann?
Wie bekomm ich den Inhalt von g in meine Imagebox?
Hi JonnyJohnson,
wenn du dir mal den verlinkten Artikel angeschaut hättest, könntest du dir genau solche Nachfragen sparen. Gleich am Anfang ist erklärt, daß man im Paint-Eventhandler zeichnet, und dort auch das richtige Graphics-Objekt zur Verfügung gestellt bekommt.
Christian
Weeks of programming can save you hours of planning
Ich versuche ihn seit einer Stunde zu verstehen, aber der wesentliche Punkt wie genau man nun zeichnet, kommt da nicht wirklich durch.
Wo genau ist denn der "wesentliche Punkt"? Ich hab leider keine Glaskugel da, und weiß daher auch nicht, wo ich dir wie helfen könnte.... 8)
Christian
Weeks of programming can save you hours of planning
Also das grundlegende klappt ja. Ich habe Bilder und lege diese übereinander. Das Problem ist das zeichnen, wie genau kommt der Bildinhalt auf die Oberfläche?
Hallo JonnyJohnson,
das ist in dem verlinkten Tutorial ausführlich und verständlich beschrieben. Das sage ich nicht aus Eigenlob, sondern aufgrund des Feedbacks von vielen Lesern des Tutorials, die genau das bestätigen. Daher sollte die Umsetzung auf deinen konkreten Anwendungsfall leicht von der Hand gehen. Wenn nicht, fehlen dir möglicherweise noch ein paar Grundlagen. Die Zeit, dir diese anzueignen, solltest du dir auf jeden Fall nehmen, siehe [Hinweis] Wie poste ich richtig? Punkt 1.1.1. Natürlich kann es auch sein, dass du einfach nur auf dem Schlauch stehst, aber dann bleibt es für uns ein reines Ratespiel, bei dem wir uns weiter im Kreis drehen.
herbivore