VB.NET: Bitmap im Code erstellen und als Datei speichern

Terminator2

Erfahrenes Mitglied
Hallo,

Versuche malwieder etwas zu zeichnen, und es ist immer noch so kompliziert wie vorher...
Diesmal soll im Quellcode ein Image/Bitmap Object oÄ. erzeugt werden, in welches ich dann einzelne Pixel zeichnen kann. Das Bild soll hinterher eine von mir bestimmte Auflösung haben und einfach als JPG oder BMP oder GIF gespeichert werden. Der Hintergrund soll weiß sein und die Punkte schwarz oder rot etc.
Sinn des Ganzen ist: Ich habe ein Zahlenarray mit 0en und 1sen. Dann gehe ich das Array durch und zeiche an jedem Punkt, an dem eine 1 ist, einen schwarzen Punkt in mein Image bzw. Bitmap Objekt. Jedoch soll das Ganze hinterher gespeichert werden, damit ich es einfacher skalieren kann. Sonst müsste ich das Bild ja jedes mal neu zeichnen, wenn sich die Anzeigegröße ändert. So arbeite ich immer mit der optimalen Größe (Breite = Array-Länge(0) ; Höhe = Array-Länge(1) da es ein 2-dimensionales Array ist)

Ich habe im moment das Problem, dass ich kein Bitmap Objekt erzeugen kann, weil VS meint, ich hätte der Variable keinen Wert zugeteilt, aber ich will ja ein neues Bild erzeugen, aber mit Dim Bild As New Bitmap funktioniert das nicht. Kennt sich da jemand aus?

Ich hoffe mir kann da jemand weiterhelfen.

DANKE!
 
Zuletzt bearbeitet:

Alexander Schuc

crazy-weasel
Hi.

Es gibt keinen parameterlosen Konstruktur von Bitmap.

Bitmap-Konstruktoren

Wennst dir die Liste ansiehst, wirst einen mit 2 Int Parametern entdecken, der ist genau richtig für dich. Diese Parameter geben Höhe und Breite an.

Mit der SetPixel Methode kannst dann deine Punkte setzen...

lg, Alex
 

Terminator2

Erfahrenes Mitglied
Hallo,

Perfekt. Jetzt klappt das mit New Bitmap(Width,Height) wirklich gut, und ich muss kein Bild mehr von der Festplatte öffnen.

Nur noch eine Frage:
Ich habe zur Verdeutlichung der Linien eine Linienstärke eingebaut. Das funktioniert wie folgt: Wenn ich einen Punkt zeichne und der Funktion die Linienstärke übermittle, zeichnet diese um den Punkt ein Quadrat mit der angegebenen Linienstärke als Kantenlänge, sodass ich die Punkte eben viel größer zeichne. Nur dauert das Ganze etwas lange. Bei Linienstärke = 5 Pixel ergibt das durchschnittlich 135.625 Bildpunkte. Gibt es Möglichkeiten das Zeichnen zu beschleunigen? Oder wäre es sinnvoll, erst ein Zahlenarray zu erzeugen, dort die Punkte alle einzutragen (Mit Linienstärke) sodass viele Pixel nicht doppelt gezeichnet werden? Oder dauert das dann genauso bis noch länger?

Edit: Habe das mit dem Array einfach mal ausprobiert. Das bringt eine irre Beschleunigung des Ganzen. Also falls jemand etwas ähnliches macht, einfach ein Zahlenarray erzeugen, welches dann den Farbcode als Zahl enthält. Man könnte auch ausprobieren ein Farbarray zu erzeugen, dann hätte man noch vielfältigere Möglichkeiten, werde das auch noch testen.

Danke für die Hilfe!

mfg
David
 
Zuletzt bearbeitet:

Terminator2

Erfahrenes Mitglied
Hey,

Also das Unsafe Image Processing ist nicht so mein Ding. Das ist erstens in C# und zweitens auch kein großer Fortschritt gegenüber meinem Programm, weil das mittlerweile sehr schnell ist und daher nicht unbedingt solch eine Änderung erfordert.

Aber ich halte trotzdem mehr von dem Graphics Objekt, das ist mithilfe der GDI und funktioniert auch sehr gut. Aber da habe ich noch zwei Fragen:
1. Man muss die Prozeduren immer mit einem Paint Ereignis aufrufen. Aber wie soll ich das anstellen, wenn ich OOP arbeite? Ich habe Form_Load und dann rufe ich eine Private Sub LoadImage auf, aber da komme ich nicht mehr an "System.Windows.Forms.PaintEventArgs" Wie kann ich das anstellen?
2. Ich muss das Bild hinterher speichern, also als Datei, vorzugsweise JPEG. Wie kann ich das machen? Auf dem Bildschirm anzeigen geht ja, aber speichern?

Schon mal danke!

David
 

Alexander Schuc

crazy-weasel
Bei der von mir angesprochenen FromImage Methode kannst du dir dein Graphics Objekt holen wann du willst! Das Paint-Event benötigst du, wenn du auf deiner Form (oder sonstigem GUI Element) zeichnen willst.

Wenn du also dein Bild erstellen und anschließend speichern willst, gehst du folgenderweise vor:

  • Bitmap erstellen
  • Graphics Objekt holen
  • Zeichnen
  • Graphics Objekt verwerfen (Dispose)
  • Bitmap speichern (Save Methode)
 

Terminator2

Erfahrenes Mitglied
Hey,

Hätte nicht gedacht, dass das doch so einfach geht. Dann verstehe ich endlich, warum VS immer dieses Grapics Objekt wollte, weil ich versehentlich immer auf den Bildschirm zeichnen wollte :rolleyes:

Also vielen Dank!
Ich bin mir sicher, dass das Thema auch anderen Usern weiterhelfen wird!

Edit:
Da tut sich schon wieder eine neue Aufgabe auf: Ich habe gesehen, dass man GraphicPaths bilden kann. Da ich ja einzelne Punkte zeichne. Mittlerweile Ellipsen, und es wäre sehr gut, wenn ich diese miteinander verbinden könnte, und zwar immer zu der nächsten Ellipse mit dem geringsten Abstand oder nach Zeichenfolge, je nachdem was einfacher ist. Manchmal sind nämlich zu wenige Punkte vorhanden, sodass Lücken in der Kontur entstehen. Ist es möglich das zu realisieren? Sollte nicht allzuviel Rechenzeit verbrauchen, da der Vorgang schnell ablaufen soll, dauert sonst zu lange ;)


mfg
 
Zuletzt bearbeitet:

Neue Beiträge