Laden...

Zwei Bilder überlagert auf dem Form darstellen

Erstellt von JonnyJohnson vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.323 Views
Thema geschlossen
J
JonnyJohnson Themenstarter:in
17 Beiträge seit 2012
vor 11 Jahren
Zwei Bilder überlagert auf dem Form darstellen

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

1.378 Beiträge seit 2006
vor 11 Jahren

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

5.658 Beiträge seit 2006
vor 11 Jahren

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

J
JonnyJohnson Themenstarter:in
17 Beiträge seit 2012
vor 11 Jahren

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?

5.658 Beiträge seit 2006
vor 11 Jahren

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

J
JonnyJohnson Themenstarter:in
17 Beiträge seit 2012
vor 11 Jahren

Ich versuche ihn seit einer Stunde zu verstehen, aber der wesentliche Punkt wie genau man nun zeichnet, kommt da nicht wirklich durch.

5.658 Beiträge seit 2006
vor 11 Jahren

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

J
JonnyJohnson Themenstarter:in
17 Beiträge seit 2012
vor 11 Jahren

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?

49.485 Beiträge seit 2005
vor 11 Jahren

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

Thema geschlossen