VB Express 2010: Leeres Bild erstellen

Hallo,

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!!

Hallo, Jörg

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.

VG
Carsten

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.

Grüße, JasonDelife.

Hallo,

probier doch mal:

 Bitmap y = new Bitmap();

 Bitmap z = y.Clone();

Das sollte Dir eine eigenständige Kopie erstellen.

Grüße,

Danke, aber…
Hi,

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…

Gruß Jörg

Hallo Jörg.

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.

VG
Carsten

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.

Gruß,
Martin