ich habe 2 Bilder über „Bild1, bzw. Bild2 = Image.FromFile()“ geladen,
beide sind als Bitmap definiert. Mit der GetPixel-Methode kann ich die Pixel auslesen und verändern. Klappt. Nun möchte ich das Ergebnis einem dritten Zielbild zuweisen und in einer Picturebox anzeigen.
Ich definiere also Bild3 As New Bitmap. Wenn ich dann sage Bild3 = Bild1 klappt es im Prinzip, allerdings wird dann ein Quellbild (Bild1) mit verändert.
Ich bräuchte also eine Art leeres Zielbild, benötigte Länge und Breite sind bekannt. Dim Bild3 As New Bitmap (Breite, Länge) allein klappt nicht. Wie kann ich ein leeres (z.B. schwarzes) Bild, das auch in der Picturebox anzeigbar ist,einfach anlegen?? Danke für eure/Ihre Tipps!!
Ich definiere also Bild3 As New Bitmap. Wenn ich dann sage
Bild3 = Bild1 klappt es im Prinzip, allerdings wird dann ein
Quellbild (Bild1) mit verändert.
Versuche bitte 'mal das Folgende:
Bild3 = DirectCast(Bild1, Image)
Dies ist prinzipiell gemeint und Erfolg kann ich hier nicht garantieren.
Das Problem ist wohl, dass Bitmap ein Referenztyp ist und deshalb beim Zuweisen (auch mit DirectCast) nur die Referenz kopiert wird. Du hast also zwei Variablen, die auf das gleiche Bitmap zeigen. Soweit ich weiß gibt es aber einen Konstruktor von Bitmap, der ein anderes Bitmap als Vorlage nimmt. Dadurch hast du dann zwei Variablen, die auf zwei unterschiedliche Bitmaps mit gleichem Inhalt zeigen. Dann kannst du auch beide unabhängig voneinander ändern.
Danke Dir (und den anderen Antworten, vielen Dank),
aber auch das klappt nicht… Hatte es schon probiert.
Das einzige (aber nicht „elegante“) was funktioniert, ist Bild_A und Bild_B jeweils über „FromFile“ direkt das Bild von der Festplatte zuzuweisen. Dann sind die Bilder unabhängig. auch bei Clone wird das „Quellbild“ leider mitverändert. Hätte nicht gedacht, dass es (für mich) so schwer ist einer Variblen eine unabhängige Kopie eines Bildes zuzuweisen…
Das einzige (aber nicht „elegante“) was funktioniert, ist
Bild_A und Bild_B jeweils über „FromFile“ direkt das Bild von
der Festplatte zuzuweisen. Dann sind die Bilder unabhängig.
auch bei Clone wird das „Quellbild“ leider mitverändert. Hätte
nicht gedacht, dass es (für mich) so schwer ist einer Variblen
eine unabhängige Kopie eines Bildes zuzuweisen…
Vielleicht mußt Du das Ganze in eine serialisierbare Klasse packen, die ICloneabel implementiert und als öffentliche Eigenschaft das Bild enthält:
Imports System.Runtime.Serialization
Public Class DeineKlasse : Implements ICloneable
Private meinBild As New Bitmap
Public Property Bild As Bitmap
Get
Return meinBild
End Get
Set(ByVal value As Bitmap)
meinbild = value
End Set
End Property
Public Function Clone() As Object Implements System.ICloneable.Clone
Dim obj As Object
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
Using ms As New IO.MemoryStream
bf.Serialize(ms, Me)
ms.Flush()
ms.Position = 0
obj = bf.Deserialize(ms)
End Using
Return obj
End Function
Dies ist auch wieder prinzipiell gemeint. Du wirst bestimmt noch einen oder mehrere Imports machen müssen wie z.B. System.Drawing oder so ähnlich. Hoffe trotzdem, dass Dir das weiterhilft.
Hallo!
Wenn Du ein neues, „leeres“ Bild haben willst, dann geht das sehr wohl über
Dim Bild3 As New Bitmap(x, y)
Alternativ, wenn der Inhalt gleich sein soll wie ein bestehendes Image, gibt es auch dafür einen Constructor:
Dim Bild3 As New Bitmap(Bild1)
Du hast dann ein neues Bild-Objekt mit dem gleichen Inhalt wie Bild1.
Um dort rein zu zeichnen, benötigst Du ein Graphics-Objekt, welches Du Dir so besorgst:
Dim g As Graphics
g = Graphics.FromImage(Bild3)
g.FillRectangle(Brushes.Red, 0, 0, Bild3.Width, Bild3.Height)
Vergiss’ nicht, das Graphics-Objekt anschließend mit Dispose() wieder freizugeben, da es sonst zu Ressourcenlecks kommen kann.