Mit GDI+ zeichnen und dann speichern

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    msdn.microsoft.com/de-de/libra….fromimage(v=vs.110).aspx
    So kannst du in ein Image mittels GDI+ zeichnen und das dann anschließend auch abspeichern.

    System.Drawing.Bitmap ist nicht in der Lage Transparenz abzuspeichern System.Drawing.Image jedoch schon.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    System.Drawing.Bitmap ist nicht in der Lage Transparenz abzuspeichern System.Drawing.Image jedoch schon.
    Kann eiglich nicht stimmen.
    Da Bitmap von Image erbt, kann es doch alles, was Image kann.

    mys3lf schrieb:

    muss ich das im Paint event der Form zeichnen ?

    nein, sondern in die Bitmap.

    also nochmal: Gezeichnet wird mit einem Graphics.
    Soll aufs Form gezeichnet werden, dann zeichnen im Paint-Event des Forms, mit dem Graphics, was dort gegeben wird.
    Soll auf ein Control gezeichnet werden, dann zeichnen im Paint-Event des Control s, mit dem Graphics, was dort gegeben wird.
    Soll auf eine Bitmap gezeichnet werden, dann zeichnen mit dem Graphics, was man sich mit Graphics.FromImage(bmp as Bitmap) holt.

    mys3lf schrieb:

    Paint event der Form
    Du kannst das Paint-Event der Form und das Paint einer Bitmap zu einer gemeinsamen Prozedur zusammenführen, der Du das Graphics-Objekt übergibst.
    Wenn Du das richtig machst, kannst Du das auch zum Drucken verwenden. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ErfinderDesRades Klingt komisch ist aber so. Ich hatte erst gestern genau dieses Problem, dass beim Abspeichern eines Bitmaps die Transparenz verloren ging, Cast nach Image und anschließendes speichern funktioniert. Deshalb Vermute ich, dass das Bitmap die Save-Methode überschreibt.
    Zumindest ist dies bei der Implementierung von Mono der Fall, aber da ich das Problem durch googlen einfach gelöst hatte und einige andere das Problem hatten gehe ich mal davon aus, dass es auch für das .Net Framework gilt.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @jvbsl
    Nein, man kann definitiv Bitmaps mit Transparenz speichern. Es ist möglich, dass das unter Mono nicht funktioniert, aber eigentlich müsste das ein Fehler deinerseits sein.
    System.Drawing.Bitmap ist nicht in der Lage Transparenz abzuspeichern System.Drawing.Image jedoch schon.

    Definitiv falsch.

    VB.NET-Quellcode

    1. Using Bipm As New Bitmap(100, 100)
    2. Using g = Graphics.FromImage(Bipm)
    3. g.DrawLine(Pens.Red, 0, 0, 100, 100)
    4. End Using
    5. Bipm.Save("C:\Users\Niko\Desktop\Test.png", System.Drawing.Imaging.ImageFormat.Png)
    6. End Using


    Vorsicht aber: Das Dateiformat ".bmp" (steht für "Bitmap") kann keine Transparenz speichern! Vielleicht war das gemeint.

    Edit Nach Post #6:
    Hast Du auch wirklich die Save-Methode mit dem ImageFormat-Parameter verwendet? Standardmäßig wird nämlich das RawFormat verwendet. Bei einer neu erstellten Bitmap ist das b96b3caa-0728-11d3-9d7b-0000f81ef32e. Und das ist die GUID vom Bitmap-Format:

    VB.NET-Quellcode

    1. 'Direktfenster
    2. ?System.Drawing.Imaging.ImageFormat.Bmp.Guid
    3. {b96b3cab-0728-11d3-9d7b-0000f81ef32e}
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    Jou.
    Ich hab mal vorher das Graphics-Objekt transparenziert, funktioniert tadellos:

    VB.NET-Quellcode

    1. Using bmp As New Bitmap(100, 100)
    2. Using g = Graphics.FromImage(bmp)
    3. g.Clear(Color.Transparent)
    4. g.DrawLine(Pens.Red, 0, 0, 100, 100)
    5. End Using
    6. bmp.Save("C:\Temp\Test.png", System.Drawing.Imaging.ImageFormat.Png)
    7. End Using

    @Niko Ortner Bei Deinem Snippet hatter den Pfad nicht gefunden. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Eure Tests decken nicht ganz das ab, was ich meinte: Ich meinte einen Alphakanal, nicht einfache Transparenz.
    Entschuldigung, dass ich mich nicht ganz klar ausgedrückt habe.
    Aber hat mich jetzt interessiert, deshalb hab ich noch einmal einen Unabhängigen test gestartet(auf Linux) und siehe da, alles funktioniert wie man es erwartet.
    Also ist da wohl kein Fehler in Mono(zumindest nicht für diese Standardfunktionen). Aber bei meinem Projekt handelte es sich auch um ein paar kompliziertere Sachen mit LockBits und OpenGL hin und her kopiererei.
    Die Frage ist jetzt, ob es nur Zufall war, dass es "gefixt" war, nachdem ich Image statt Bitmap verwendet hab, also dass irgendwelche anderen Codestellen das eigentliche Problem ausgelöst haben.

    Das Teste ich dann später wenn mein Code wieder lauffähig ist und wenn ich es nicht vergesse bekommt ihr auch ein Update.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---