PictureBox mit HexDaten füllen

  • VB.NET
  • .NET (FX) 4.0

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

    PictureBox mit HexDaten füllen

    Hallo Leute.

    Ich möchte eine Userform erstellen in der in einer PictureBox ein Symbol angezeigt werden soll.
    Das Symbol ist in einer Textdatei gespeichert und enthält die HexWerte der Farben. Der Dateiinhalt sieht wie folgt aus:

    R00="565250E6E5E5FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF0F0F0ECEBEBFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAE5E4E4" R01="565250FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBEBD5B5856605C5A787573ECECEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA" R02="565250FAFAFAFFFFFFFFFFFF7E7B79FFFFFFFFFFFF8F8C8BEFEEEEFFFFFFA4A2A1ADABAAE5E4E4FFFFFFCCCBCB8F8C8AF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA" R03="565250FAFAFAFFFFFFFFFFFF6E6B69FFFFFFFFFFFF817E7CEDEDECFFFFFF5B5755F6F6F5FFFFFFFFFFFFFFFFFF35312E514D4A57535157535157535157535154514ED5D4D4FFFFFFFFFFFFFFFFFFFFFFFFFAFAFA"

    Wie bekomme ich diese Daten am besten in eine PictureBox? Hat da jemand eine Idee?

    Gruß, Koala
    Dateien
    • Symbol.txt

      (4,93 kB, 94 mal heruntergeladen, zuletzt: )

    Koala2000 schrieb:

    Hat da jemand eine Idee?
    Beschreib mal präzise den Ablauf der Datenverarbeitung vom Auslesen der Daten bis zu ihrer Darstellung.
    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!
    na, was wird das für ein Ablauf sein -
    1. einlesen
    2. in eine Bitmap wandeln
    3. Bitmap in Picturebox anzeigen
    Problem wird das Wandeln in eine Bitmap sein, da wirst du wohl den Ersteller der Datei fragen müssen, was diese ganzen Buchstaben da im Einzelnen zu bedeuten haben.
    Ich könnte mir vorstellen, es seien die 4 Farbkanäle - aber woher weiß dann die Bitmap, wie breit und hoch sie werden soll? ?(

    Wie gesagt: Wende dich mit solchen Fragen an den Erfinder dieser fabelhaften TextDatei.

    Koala2000 schrieb:

    in eine PictureBox
    So:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim R00 = "565250E6E5E5FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF0F0F0ECEBEBFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAE5E4E4"
    3. Dim R01 = "565250FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBEBD5B5856605C5A787573ECECEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA"
    4. Dim R02 = "565250FAFAFAFFFFFFFFFFFF7E7B79FFFFFFFFFFFF8F8C8BEFEEEEFFFFFFA4A2A1ADABAAE5E4E4FFFFFFCCCBCB8F8C8AF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA"
    5. Dim R03 = "565250FAFAFAFFFFFFFFFFFF6E6B69FFFFFFFFFFFF817E7CEDEDECFFFFFF5B5755F6F6F5FFFFFFFFFFFFFFFFFF35312E514D4A57535157535157535157535154514ED5D4D4FFFFFFFFFFFFFFFFFFFFFFFFFAFAFA"
    6. Dim bmp = New Bitmap(R00.Length \ 6, 4)
    7. convertRow(bmp, 0, R00)
    8. convertRow(bmp, 1, R01)
    9. convertRow(bmp, 2, R02)
    10. convertRow(bmp, 3, R03)
    11. Me.PictureBox1.Image = bmp
    12. bmp.Save("c:\temp\test.png") ' zum Ansehen
    13. End Sub
    14. Sub convertRow(bmp As Bitmap, row As Integer, txt As String)
    15. For i = 0 To (txt.Length - 1) \ 6 Step 6
    16. Dim ss = txt.Substring(i, 6)
    17. Dim val = Convert.ToInt32("FF" & ss, 16)
    18. bmp.SetPixel(i, row, Color.FromArgb(val))
    19. Next
    20. End Sub
    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!
    Hallo.

    Zum besseren Verständnis mal hier mal eine Beschreibung der Datei.

    Die Textdatei enthält immer ein Bitmap in der Größe 28x28Pixel
    Jede Zeile beginnt mit einem Kürzel. "R00" steht für "Row 0", dann folgen die HexWerte der Farben, immer 6 Zeichen sind eine Farbe.
    Es gibt also immer genau 28 Zeilen (00 bis 27) und darin enthalten 28x6 Zeichen. Mit Semikolon getrennt würde eine Reihe so aussehen:
    565250;FAFAFA;FFFFFF;FFFFFF;6E6B69;FFFFFF;FFFFFF;817E7C;EDEDEC;FFFFFF;5B5755;F6F6F5;FFFFFF;FFFFFF;FFFFFF;35312E;514D4A;575351;575351;575351;575351;54514E;D5D4D4;FFFFFF;FFFFFF;FFFFFF;FFFFFF;FAFAFA

    Es muss also die Textdatei geöffnet werden, Zeilenweise gelesen und ausgewertet werden und dann in der Picture Box angezeigt werden.

    Den Code von Rod werde ich gleich mal probieren.
    Schon einmal Vielen Dank für Eure Mühe.

    Gruß, Koala
    @ErfinderDesRades :
    Ja isses. Nur die Leerzeichen sind eig Zeilenumbrüche denke ich, und dann halt 28 Stck davon.

    Also: Einlesen, bei " " bzw. "\r\n" splitten (VB ist es Environment.NewLine), dann entweder mit RegEx oder mit String-Funktionen den eigentlichen "HexString" herausfiltern, den immer in 6er-Blöcke splitten, HexWert in Color konvertieren, und bei Bitmap setzen.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Die richtige Datei habe ich bereits bei meinem ersten Post angehängt. Wenn man die Datei mit dem Editor öffnet und den Zeilenumbruch raus nimmt stehen die Zeilen sauber untereinander...

    Ich habe mal mit der Funktion von Rod folgenden Code erstellt, läuft aber leider noch nicht.

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. Dim Quelldatei As String = "c:\Temp\Symbol.txt"
    3. Dim TextZeile As String
    4. Dim TextNurHex As String
    5. Dim bmp = New Bitmap(28, 28)
    6. Dim Col As Integer = 0
    7. If System.IO.File.Exists(Quelldatei) = True Then
    8. Dim objReader As New System.IO.StreamReader(Quelldatei, System.Text.Encoding.Default)
    9. Do While objReader.Peek() <> -1 'bis Dateiende
    10. TextZeile = objReader.ReadLine() 'Zeile lesen
    11. TextNurHex = TextZeile.Substring(5, 168)
    12. 'MsgBox(TextNurHex)
    13. Col = Col + 1
    14. convertRow(bmp, Col, TextNurHex)
    15. Loop
    16. objReader.Close()
    17. Me.PictureBox1.Image = bmp
    18. Else
    19. MsgBox("Datei ist nicht vorhanden, Bearbeitung wird abgebrochen!", vbExclamation, "Falscher Dateiname...")
    20. End If
    21. MsgBox("fertig...")
    22. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ () aus folgendem Grund: Leerzeilen im Code entfernt

    Sorry, wollte eigentlich nach dem Code noch weiter schreiben...

    Habe den Code jetzt wie folgt geändert:

    VB.NET-Quellcode

    1. Sub convertRow(ByVal bmp As Bitmap, ByVal row As Integer, ByVal txt As String)
    2. For i = 0 To (txt.Length - 1) \ 6 Step 6
    3. Dim ss = txt.Substring(i, 6)
    4. Dim Val = Convert.ToInt32("FF" & ss, 16)
    5. bmp.SetPixel(i, row, Color.FromArgb(Val))
    6. Next
    7. End Sub
    8. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    9. Dim Quelldatei As String = "c:\Temp\Symbol.txt"
    10. Dim TextZeile As String
    11. Dim TextNurHex As String
    12. Dim bmp = New Bitmap(28, 28)
    13. Dim Row As Integer = 0
    14. If System.IO.File.Exists(Quelldatei) = True Then
    15. Dim objReader As New System.IO.StreamReader(Quelldatei, System.Text.Encoding.Default)
    16. Do While Row = 28 'objReader.Peek() <> -1 'bis Dateiende
    17. TextZeile = objReader.ReadLine() 'Zeile lesen
    18. TextNurHex = TextZeile.Substring(5, 168)
    19. 'MsgBox(TextNurHex)
    20. Row = Row + 1
    21. convertRow(bmp, Row, TextNurHex)
    22. Loop
    23. objReader.Close()
    24. bmp.Save("c:\temp\test.png") ' zum Ansehen
    25. Me.PictureBox1.Image = bmp
    26. Else
    27. MsgBox("Datei ist nicht vorhanden, Bearbeitung wird abgebrochen!", vbExclamation, "Falscher Dateiname...")
    28. End If
    29. MsgBox("fertig...")
    30. End Sub


    Jetzt läuft alles sauber durch, nur zu sehen ist absolut nichts. Weder in der Datei noch in der PictureBox. Was habe ich falsch gemacht?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ () aus folgendem Grund: Leerzeilen aus Code entfernt

    @Koala2000 Das wäre dann der minimale Aufwand:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim bmp = New Bitmap(28, 28)
    3. Dim ll() = IO.File.ReadAllLines("C:\Temp\Image.txt")
    4. For i = 0 To Math.Min(ll.Length, 28) - 1
    5. convertRow(bmp, i, ll(i).Substring(5, 168))
    6. Next
    7. Me.PictureBox1.Image = bmp
    8. bmp.Save("c:\temp\test.png") ' zum Ansehen
    9. End Sub
    10. Sub convertRow(bmp As Bitmap, row As Integer, txt As String)
    11. For i = 0 To (txt.Length - 1) \ 6 Step 6
    12. Dim ss = txt.Substring(i, 6)
    13. Dim val = Convert.ToInt32("FF" & ss, 16)
    14. bmp.SetPixel(i, row, Color.FromArgb(val))
    15. Next
    16. End Sub
    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!
    Das funktioniert bereits sehr gut, leider steckt noch irgendwo ein kleiner Fehler drin. Das Bild wird in Streifen zerlegt angezeigt. Es muss also etwas mit dem Sprung von 6 Zeichen zu tun haben. Aber irgendwie finde ich den Fehler auch nach vielen suchen und verändern nicht... ?(
    Bilder
    • Symbol.GIF

      60,63 kB, 448×466, 108 mal angesehen

    Koala2000 schrieb:

    den Fehler
    Sieh Dir die Rohdaten an und lösch da mal die betreffenden Spalten raus, nachdem Du eine Sicherheitskopie gemacht hast.
    Bedenke dann die neue Zeilenlänge.
    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!
    Hallo Rod.

    Ich habe den Fehler gefunden.

    VB.NET-Quellcode

    1. Sub convertRow(bmp As Bitmap, row As Integer, txt As String)
    2. For i = 0 To (txt.Length - 1) Step 6
    3. Dim ss = txt.Substring(i, 6)
    4. Dim val = Convert.ToInt32("FF" & ss, 16)
    5. bmp.SetPixel(i / 6, row, Color.FromArgb(val))
    6. Next
    7. End Sub


    Ich habe das /6 aus der Zeile for i... rausgenommen und in die Zeile bmp.SetPixel... geschrieben. Jetzt funktioniert alles wie gewünscht. Super... :thumbup:

    Vielen Dank an Dich für den super Code, natürlich auch Danke an alle anderen für eure Hilfe.

    DANKE

    Gruß, Koala