Abspeichern von Texten und Bildern in Pictureboxen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Abspeichern von Texten und Bildern in Pictureboxen

    Hallo,
    ich bin neu in diesem Form und habe auch nicht sehr viel erfahrung bin absoluter Anfänger. Nun mir fehl noch ein kleiner Tipp von euch Profis um mein Projekt zu vollenden. Und zuwar will ich in ein Bild, welches sich in einer Picturebox beifdet, mit einem Text versehen welchen ich in das Bild einfüge. Den Text bekomme ich schomal (per Mausklick) in das Bild geschrieben aber beim speichern scheitert es leider...

    So füge ich meinen Text in das Bild ein.

    VB.NET-Quellcode

    1. Private Sub Picturebox1_Mouseclick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
    2. Dim Text_str As String = TextBox3.Text
    3. Dim font As New Font("Arial", 25)
    4. Dim brushes As New SolidBrush(Color.Red)
    5. PictureBox1.CreateGraphics.DrawString(Text_str, font, brushes, e.Location.X, e.Location.Y)


    So habe ich es versucht zu speichern was aber nicht funktioniert denn ich glaube der Text wird nicht in das Bild geschrieben sondern Über das Bild geltgt.

    VB.NET-Quellcode

    1. PictureBox1.Image.Save("C:\\ + Textbox1.text + "\" + Textbox2.text" + .jpg", System.Drawing.Imaging.ImageFormat.Jpeg)


    Ich hoffe ihr habt eine einfache Antwort für mich schonmal viel dank im vorraus ;)
    1. ​CreateGraphics ist meistens böse. Wenn Du das hier einmal nutzt, ist es ok, ansonsten immer ​Paint-Event nutzen!
    2. Dispose unbedingt Deine Brushes etc., Du erschaffst Dir sonst böse Speicherlecks.
    3. ​Path.Combine nutzen.
    4. Ist das somit ein String und nicht der Inhalt der TextBoxen. Diese haben allerdings den selben Typen, sodass Du das verbinden kannst.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ja das habe ich auch schon festgestellt. Nur habe ich keine ahnung wie ich es anders machen soll z.b. wie Trade sagte mit einem Paint-Event.
    Deswegen ja die frage ob man es so abspeichern kann oder geht es so überhaupt nicht solange ich CreateGraphics verwende?
    Ja, so:

    VB.NET-Quellcode

    1. Dim Text_str As String = "<Text>"
    2. Dim font As New Font("Arial", 25)
    3. Dim brushes As New SolidBrush(Color.Red)
    4. Dim bmp As New Bitmap(PictureBox1.Image)
    5. Dim g As Graphics = Graphics.FromImage(bmp)
    6. g.DrawString(Text_str, font, brushes, e.Location.X, e.Location.Y)
    7. PictureBox1.Image = bmp
    8. g.Dispose()
    9. brushes.Dispose()
    10. font.Dispose()
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Danke das funktioniert schonmal perfekt super!
    Aber jetzt setzt er meinen Text leider nichtmehr an die stelle, an der sich der Courser befindet, sondern wenn sich der Courser rechts am Bildrand befindet setzt er den Text ca. 3-4cm nach links versetzt und auf der Linken seite genau anders herum.
    Gibt es noch einen anderen code ausßer e.Location oder e.Location.x, e.Location.y oder Cursor.Position oder kann ich das anders machen?
    Ja genau so ist es leider.
    Kann ich irgendwie die Koordinaten herausfinden, auf denen sich mein cursor im image befindet?

    Bei der Picturebox geht es so:

    VB.NET-Quellcode

    1. Dim p As Point = PictureBox1.PointToClient(Cursor.Position)
    2. Dim x As String = p.X.ToString
    3. Dim y As String = p.Y.ToString


    Habe es schon mit

    VB.NET-Quellcode

    1. Dim p As Point = PictureBox1.Image.PointToClient(Cursor.Position)
    2. Dim x As String = p.X.ToString
    3. Dim y As String = p.Y.ToString

    versucht aber das funktioniert auch nicht dann wirft er nen Fehler aus.
    PointToClient ist für was anderes.

    Für die Skalierung umzurechnen musste ühaupt mal klären, wie skaliert ist.
    Etwa bei SizeMode.Stretch entsprechen die Abmasse der PB den Abmassen des Images. Da kann man dann in X-/Y-Richtung eine Verhältnisrechnung machen der Verhältnisse von PB.Width-Image.Width und PB.Height-Image.Height

    NN2000 schrieb:

    auf denen sich mein cursor im image befindet
    In welcher Prozedur steht dieser Code?
    Schon mal mit MouseMove probiert?
    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!
    Also ich habe PictureBoxSizeMode.Zoom gewählt. Somit ist die Picturebox nicht ganz ausgefüllt bzw. nur in eine Richtung X oder Y meistens zumindestens.

    Habe es jetzt den ganzen Tag versucht über Verhältnisse zu berechnen, das hat auch soweit funktioniert aber leider immer nur in einer richtung genau die andere musste ich "murxen". Wenn das Bild quer die Picturebox komplett ausfüllt stimmt X und wenn es die Picturebox Hochkant ausfüllt stimmt Y. Die anderen richtungen musste ich dann mit einem duch testen herausgefundenen wert leicht korregieren damit es einigermaßen passt.

    Hier ist der code. Also wiegesagt ist sehr kompliziert und umständlich gemacht funktioniert aber. Fals ihr aber eine schnelle richtige Lösung hättet wäre das Super.

    VB.NET-Quellcode

    1. Private Sub Picturebox1_Mouseclick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
    2. 'Querformat
    3. If PictureBox1.Image.Size.Width < PictureBox1.Image.Size.Height Then
    4. ElseIf e.Button = Windows.Forms.MouseButtons.Left Then
    5. Dim Text_str As String = TextBox3.Text
    6. Dim brushes As New SolidBrush(Color.Red)
    7. Dim bmp As New Bitmap(PictureBox1.Image)
    8. Dim g As Graphics = Graphics.FromImage(bmp)
    9. Dim p As Point = PictureBox1.PointToClient(Cursor.Position)
    10. Dim x As String = p.X.ToString
    11. Dim y As String = p.Y.ToString
    12. Dim Wert1 As String = PictureBox1.Image.Size.Width
    13. Dim Wert2 As String = PictureBox1.Image.Size.Height
    14. Dim font As New Font("Arial", (Wert2 / 14))
    15. Dim Rechnung1 As String = Wert1 / 798
    16. '798 Pixel íst die Picturebox breite
    17. Dim Rechnung2 As String = Wert2 / 737
    18. '737 Pixel ist die Picturebox höhe
    19. g.DrawString(Text_str, font, brushes, x * Rechnung1, (y * Rechnung1) - 460)
    20. PictureBox1.Image = bmp
    21. g.Dispose()
    22. brushes.Dispose()
    23. font.Dispose()
    24. End If
    25. 'Hochformat
    26. If PictureBox1.Image.Size.Height < PictureBox1.Image.Size.Width Then
    27. ElseIf e.Button = Windows.Forms.MouseButtons.Left Then
    28. Dim Text_str As String = TextBox3.Text
    29. Dim brushes As New SolidBrush(Color.Red)
    30. Dim bmp As New Bitmap(PictureBox1.Image)
    31. Dim g As Graphics = Graphics.FromImage(bmp)
    32. Dim p As Point = PictureBox1.PointToClient(Cursor.Position)
    33. Dim x As String = p.X.ToString
    34. Dim y As String = p.Y.ToString
    35. Dim Wert1 As String = PictureBox1.Image.Size.Width
    36. Dim Wert2 As String = PictureBox1.Image.Size.Height
    37. Dim font As New Font("Arial", (Wert2 / 14))
    38. Dim Rechnung1 As String = Wert1 / 798
    39. '798 Pixel íst die Picturebox breite
    40. Dim Rechnung2 As String = Wert2 / 737
    41. '737 Pixel ist die Picturebox höhe
    42. g.DrawString(Text_str, font, brushes, (x * Rechnung2) - 770, y * Rechnung2)
    43. PictureBox1.Image = bmp
    44. g.Dispose()
    45. brushes.Dispose()
    46. font.Dispose()
    47. End If
    Also wie immer ist das wichtigste, das Problem genau zu formulieren und isoliert zu betrachten.
    Bei Sizemode.Zoom gibt es nur ein Verhälnis, also das Verhältnis Dim ratio As Double = PB.Width / Img.Width ist daselbe wie für PB.Height/Img.Height. (Im gegensatz zum Stretchen, da sind Seiten- und HöhenVerhältnis verschieden).

    Um das zu berechnen, muss man zunächstmal beide Verhältnisse berechenen, und dann wählt man das kleinere.

    Aber um sowas in Angriff zu nehmen musst du zunächst mal eine Function entwerfen, die diese Aufgabe übernimmt. Also eine Methode, die von PB und Img die Abmasse entgegennimmt und dafür die ausgerechnete Ratio zurückgibt. Die Function soll ühaupt nichts machen - nur 2 Abmasse entgegennehmen, und die Ratio am besten als Double zurückgeben.
    Dabei ist dir freigestellt, in welcher Form du die Abmasse entgegennehmen willst: Ob du nun Breiten und Höhen angibst, oder ob du gleich die ganze PictureBox + das Image hineingibst, oder noch listigeres (die PB entält ja das Image).

    Wie gesagt: das ist zunächstmal gar keine Codier-Aufgabe, sondern eine Konzipier-Aufgabe.

    Bislang hast du scheints noch nie eine eigene Function entworfen, sondern immer nur im Designer auf iwas gedoppelklickst und dann in der Methode, die generiert wird, was reingeschrieben.
    Also immer nur das innere von Methoden gestaltet.

    Jetzt kommt es drauf an, selbst eine Methode zu gestalten, angefangen mit dem Äusseren, der "Signatur".

    Vlt kann ich dich auch für Grundlagen: Fachbegriffe interessieren?
    Weil was ich sage ist eiglich total einfach, wenn man die Begriffe kennt.
    Jou.

    NN2000 schrieb:

    VB.NET-Quellcode

    1. Dim Rechnung1 As String = Wert1 / 798
    2. '798 Pixel íst die Picturebox breite
    3. Dim Rechnung2 As String = Wert2 / 737
    4. '737 Pixel ist die Picturebox höhe
    In so einem Kontext niemals die Zahlenwerte selbst reinschreiben. Was passiert, wenn Du Deine GUI veränderst, dann suchst Du überall die Stellen, wo diese Zahlen drin stehen?
    Üblicherweise findest Du mindestens eine nicht. ;)
    Entweder Du machst Dir im Hauptfenster Konstanten mitr diesen Werten oder Du liest diese Werte aus dem Control aus und speichserst sie in entsprechenden Klassenvariablen.
    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!