Zusammengefasstes Bild in PB abspeichern

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Heiko1337.

    Zusammengefasstes Bild in PB abspeichern

    Hallo Leute,
    Ich habe folgendes Problem. Ich habe eine Picturebox und ein Label in einer anderen Picturebox zusammengefasst und wollte die zweite nun abspeichern als Bild. Bis jetzt sieht es wie folgt aus:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(...) Handles MyBase.Load
    2. lblText.Text = DateTime.Now
    3. pbVorher.Controls.Add(lblText)
    4. pbNacher.Controls.Add(pbVorher)
    5. pbNacher.Image.Save("C:/test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
    6. End Sub


    Folgende Fehlermeldung erscheint beim ausführen:

    Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in test label.exe aufgetreten.

    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Aus der Fehlermeldung werde ich leider nicht Schlau.

    Könnt ihr mir weiterhelfen?

    ErfinderDesRades schrieb:

    nur ob der allgemeine Hinweis auf GDI ausreicht?

    Das weiß ich selbst leider auch nicht genau :D da ich noch nie in meinem Leben mit GDI gearbeitet habe und nur wusste wozu man es verwenden kann. Welche anderen Möglichkeiten hier jetzt noch vorhanden wären weiß ich auch nicht.

    GDI+?

    lg.

    Edit:
    Ich versteh leider aktuell auch nicht mehr so ganz was du erreichen möchtest, bzw. wie du auf den Code kommst oder was genau dein Problem ist.
    lg.

    LucaWelker
    Also ich habe eine Form mit einer picturebox und einem Bild darin. Über dieser ob ist ein Label mit dem aktuellen Datum. Jetzt soll das Datum bzw Label mit dem Bild zusammengefasst werden, das es abgespeichert werden kann als Bild mit zeitstempel. ;)
    GDI habe ich auch keine Erfahrung mit
    Dann musst du dich mit GDI auseinander setzten. Virtuell siehst du zwar den Zeitstempel aka Label in dem Bild, aber es ist eben nur ein Control welches über dem Bild ist, der Text ist nicht IM Bild vorhanden. Das geht nur wenn du den Text auch direkt in das Bild schreibst, siehe dir dazu die Graphics.DrawString-Methode an.
    Pack mal diesen Code aus der Form_Load in eine Button_Click-Routine, da sollten etwas aussagekräftigere Fehler kommen.
    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!
    ich tippe mal darauf, dass die application abschmiert da pbnachher kein image beinhaltet (.image = nothing) welches gespeichert werden kann.
    Schau mal in mein GDI+ Tutorial rein (Punkt 2 im wesentlichen). Es ist eigentlich sehr einfach auf bitmaps zu zeichnen: Graphics-objekt von einer bitmap holen, dann mittels graphics.drawstring(...) den zeitstempel auf die bitmap zeichnen und das ganze - so wie du es machen wolltest - abspeichern.
    lg
    Hallo Freunde,
    ich habe noch ein wenig rumgesucht und mir drawstring angeschaut.
    Mittlerweile befindet sich das Datum auch in der Picturebox, nur abspeichern das geht immernoch nicht.
    Hier mein Code-Schnipsel:

    VB.NET-Quellcode

    1. pbScreen.CreateGraphics.DrawString(DateTime.Now, Font, New SolidBrush(Color.Black), pbScreen.Width - 110, pbScreen.Height - 20)
    2. pbScreen.Image.Save("C:\test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)


    Das Bild wird erstellt, aber von dem Zeitstempel keine Spur.
    Was muss ich da noch beachten?

    Liebe Grüße

    Heiko1337 schrieb:

    Das Bild wird erstellt, aber von dem Zeitstempel keine Spur.

    Kein Wunder, Du zeichnest mit der Methode auf die Darstellung des Images, nicht auf das zugrundeliegende Image welches Du in die Picturebox geladen hast.Das ist etwas vollkommen anderes: so kann z.B. ein geladenes Bild (=Image) sehr klein sein, wird aber von der Picturebox vergrössert dargestellt, wenn Sizemode=Stretched o.ä. gesetzt wurde.

    Willst Du das Image selber beeinflussen, musst Du Dir eine passende Graphics Klasse holen: Graphics.FromImage Methode

    VB.NET-Quellcode

    1. Dim g As Graphics = Graphics.FromImage(pbScreen.Image)
    2. g.DrawString(DateTime.Now.ToString, Font, New SolidBrush(Color.Black), 10, 10)
    3. g.Dispose()
    4. pbScreen.Invalidate() ' picturebox neu zeichnen
    5. pbScreen.Image.Save("deineDatei.jpg")
    @ TE
    hättest du statt rumzusuchen mal einen blick in das GDI+ Tutorial geworfen hättest du sofort auf die lösung (da ist sogar ein code, der beschreibt wie man einen String auf die bitmap zeichnet) von kagaroo kommen können..

    @ kangaroo
    das einzige was mir bei deinem code nciht gefällt ist die erste zeile^^
    Dim g As Graphics = Graphics.FromImage(pbScreen.Image)
    ist jetzt nicht so tragisch nur bringt das den eindruck als würde man die picturebox brauchen.. das wiederum verleitet unwissende zu der annahme immer pictureboxen setzen zu müssen. ich verwende die PB ausschließlich zum anzeigen der ergebnisse - also die bearbeitete bitmap - alles andere ist meiner meinung nach so als würde man variablen in labels "speichern" und dann damit rechnen.. wenn ich damit falsch liege bitte korrigieren^^
    zu

    g.DrawString(DateTime.Now.ToString, Font, New SolidBrush(Color.Black), 10, 10)

    diesem Code wird mit folgende Fehlerbeschreibung geliefert:

    "Ein Grafikobjekt kann nicht aus einem Bild mit einem indizierten Pixelformat erstellt werden."



    da musst du wohl mal die PixelFormat-Property des Images überprüfen, was du bemalen willst, weil scheinbar funzt GDI nur mit bestimmten PixelFormaten.

    Gängige Formate sind:
    System.Drawing.Imaging.PixelFormat.Format24bppRgb, System.Drawing.Imaging.PixelFormat.Format32bppArgb etc.

    Hingegen bei
    System.Drawing.Imaging.PixelFormat.Format1bppIndexed, System.Drawing.Imaging.PixelFormat.Format4bppIndexed, System.Drawing.Imaging.PixelFormat.Format8bppIndexed

    kann gut sein, dass nicht geht.

    vlt. gibts auch eine Drawstring-Überladung, der man einen Farb-Index angeben kann, statt einer Color.

    Ansonsten müssteste das Bild halt umkopieren in ein gängiges Format.

    Indizierte Bildformate sind viel kompakter als die gängigen, aber natürlich kann man da nicht mit beliebigen Farben drauf rummalen, wenn im Farb-Index der Bitmap nur 2, 16 oder 256 Farben vorgesehen sind

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()