e.Graphics als .gif speichern.

  • VB.NET

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

    e.Graphics als .gif speichern.

    Hallo alle zusammen.

    Leider scheitere ich beim Versuch ein "e.Graphics" als .gif auf die Festplatte zu speichern.

    Hier mal der nicht funktionierende Kode.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim destRect As Rectangle
    3. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    4. destRect = New Rectangle(20, 20, 146, 150)
    5. End Sub
    6. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.PaintDim newImage As Image = Image.FromFile("C:\...\Osterblumen.gif")
    7. e.Graphics.DrawImage(newImage, destRect)
    8. newImage = Image.FromFile("C:\...\blum.gif")destRect = New Rectangle(134, 20, 150, 146)
    9. e.Graphics.DrawImage(newImage, destRect)
    10. newImage = Image.FromFile("C:\...\OsterblumenRotated.gif")destRect = New Rectangle(240, 30, 150, 146)
    11. e.Graphics.DrawImage(newImage, destRect)
    12. Dim saveBitmap As New Bitmap(350, 150, e.Graphics)
    13. saveBitmap.Save("C:\...\Test1.gif", System.Drawing.Imaging.ImageFormat.Gif)
    14. End Sub
    15. End Class

    Als Ergebnis erhalte ich ein wunderbares SCHWARZES Bild!!!!! :wacko:
    Danke im Voraus,
    Jeiss
    follgendes sollte dir denke ich helfen:

    VB.NET-Quellcode

    1. Dim saveBitmap As New Bitmap(350, 150)
    2. Using g As Graphics = Graphics.FromImage(saveBitmap)
    3. 'Hier alles nocheinmal zeichnen, nur mit g.Draw... statt mit e.Graphics.Draw...
    4. End Using
    5. saveBitmap.Save("C:\...\Test1.gif", System.Drawing.Imaging.ImageFormat.Gif)

    das Paint Event ist aber auch nicht der richtige Ort um das ganze abspeichern zu lassen, da ist denke ich eher ein anderes Event gefragt ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Vielen Dank jvbsl

    Super schnelle Antwort!

    Was der Ideale Ort für das speichern des Bildes angeht, da hast du natürlich auch Recht.

    Zu Testzwecken habe ich das einfach so hintendran gehängt...

    Worüber ich allerdings nicht ganz zufrieden bin ist die Qualität des gespeicherten Bildes. :(

    Irgendwie ist es etwas "Grobkörnig".

    Kann man das irgendwie glätten? Geift da ein snoothingMode?

    Auf jedenfall danke ich dir für deine schnelle Antwort, so kann ich wenigstens wieder weiter-programmieren.

    Danke,

    Jeiss

    VB.NET-Quellcode

    1. g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias

    evtl. auch einfach die größe des Bildes ändern und das ganze etwas vergrößern(mit der Matrix Transformation kannst du das ganze sozusagen dann stretchen)...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ja smoothingMode bringt leider nichts!

    Aha du würdest das schlechte Bild auch noch stretchen? Interessant, ich habe es im Gegenteilt geschrumpft (mit Irfanview).

    Ist natürlich etwas schade dass ich deshalb auf Irfanview zugreifen musste, aber wer weiss später mach ich das vieleicht mal mit meinem eigenen Kode.....hoffentlich!

    Der Fehler ist somit im "akzeptablen" Bereich. Für mich gillt der Fall also dank deiner Hilfe als geregelt.

    Aber da du das mit der "Matrix Transformation" erwähnt hast. Ist das kompliziert?

    Hättest du vieleicht einen leicht verständlichen Link damit ich auch sehen kann was du meinst. Wer weiss wo ich das ja mal gebrauchen kann. :rolleyes:

    Also nochmal vielen Dank,

    Jeiss
    Für die Matrix:
    codeproject.com/KB/GDI-plus/matrix_transformation.aspx

    also dein Code würde sich dann wie folgt ändern:

    VB.NET-Quellcode

    1. Dim scale As Integer = 5 'Bild fünf mal so groß
    2. Dim saveBitmap As New Bitmap(350 * scale, 150 * scale)
    3. Using g As Graphics = Graphics.FromImage(saveBitmap)
    4. g.Matrix = New Drawing2D.Matrix()
    5. g.Matrix.Scale(5,5,MatrixOrder.Append)
    6. 'Hier alles nocheinmal zeichnen, nur mit g.Draw... statt mit e.Graphics.Draw...
    7. End Using
    8. saveBitmap.Save("C:\...\Test1.gif", System.Drawing.Imaging.ImageFormat.Gif)


    ist jetzt aus dem Kopf geschrieben, dabei sollte aber das Bild 5 mal so groß abgespeichert werden(also wird nicht das Ergebnis vergrößert sondern bereits vor dem Speichern, was jenach Input Bildern eine starke Qualitätssteigerung hervorbringt...
    Ansonsten halt mal nicht das Gif Format verwenden :P
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Nicht schlecht! Heute hab ich wieder manches hinzugelernt und einiges wieder aufgefrischt.

    Ich musste mal kurz wieder nachsehen wie Matrizen verrechnet werden, sowas benutzt man ja nicht gerade jeden Tag....

    Schade nur dass das beispiel in deinem Link nicht in visual basic geschrieben ist, hätte gerne ein wenig damit rum-experimentiert, wie gesagt, schade!!!

    Danke,

    Jeiss
    kein Problem, man kann C# ohne Probleme in VB .Net übersetzen...
    Wenn man es nicht selber kann gibt es dafür auch Tools:
    developerfusion.com/tools/convert/csharp-to-vb/
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Genau den Online-Converter benutze ich auch wenn ich mal irgend einen Kode-Schnippsel konvertieren muss.

    Aber gleich ein ganzes Projekt konvertieren...du schreckst wirklich vor gar nichts zurück! Gut so. Perfekt!

    Also downladen kann ich das C#-Projekt ja bestimmt. Und dann? Visual Basic öffnet mir sowas bestimmt nicht! Oder?

    Dann muss ich also die Datei finden welche (bie VB) der .vb-Datei entspricht. Und die Datei wo der Form-Designer-Kode drinsteht.

    Und dann Online konvertieren....oder wie hast du das gemeint? :?:

    Das klingt ziemlich kompliziert! Oder gibt es da einen schnelleren Weg um ein C#-Projekt in VB umzuwandeln?

    Danke,

    Jeiss
    es gibt sicherlich Converter für ganze Projekte, aber als ich mal ein C# Projekt konvertiert hab, da hab ich einfach jede einzelne .cs Datei konvertieren lassen und als .vb-Datei abgespechert und diese anschließend zu einer Projektmappe hinzugefügt... Ansich ging das gar nicht allzu lang(bis auf die Fehler korrektur ;))
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ja, ich hab es tatsächlich auf die Reihe gekriegt das C#-Projekt in VB umzuwandeln!

    Das war für mich schon ziemlich schwierig. Aber es hat geklappt!

    C# scheint eine sehr praktische Sprache zu sein, denn der Programm-Code und der FormDesigner-Code waren in der gleichen Datei untergebracht....... Schwierig war auch das kleine "CodeProjekt-Männlein" in die Ressourcen reinzukriegen damit es als Image für die PictureBox benutzt werden konnte. Dar Ergebnis war es auf jeden Fall wert ein paar Stunden in die Umwandlung des Projektes zu investieren.

    So, somit kann ich meine Frage endgültig als Beantwortet betrachten. :thumbsup: Da war doch irgendwo so ein "Erledigt"-Button......

    Danke nochmal,

    Jeiss
    Da will ich nochmal nachhaken :P
    Du kannst in VB ebenfalls Designer-Ccode sowie normalen Programmiercode in einer Dattei unterzubringen, jedoch ist dies bei neueren Projekten weder bei einem C# noch bei einem VB .Net Projekt der Fall, was auch gut so ist, da Anfänger am besten die Finger von solchem Code lassen sollten ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---