DataGridView aus Byte Array befüllen

  • VB.NET

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

    DataGridView aus Byte Array befüllen

    Hallo und guten Morgen zusammen,

    ich bin gerade dabei eine kleine Bitmap (8x8) in ein Byte Array einzulesen. Das klappt auch hervoragend und die Daten sind auch korrekt im Byte Array enthalten.
    Nun möchte ich ein DataGridView mit den Array Daten füllen d.h. nur die Pixel also Farbdaten (Werte sind also nur 0 und 255) KEINE Daten vom Bitmapheader!
    Die Bitmap habe ich sehr einfach gehalten (4 Farben,R,G,B,Schwarz) um das Beispiel nicht unnötig zu verkomplizieren!

    Ich würde gerne in jede der 8 Spalten die 3 Farbwerte eines einlesen also z.B.: 255,0,255 oder 255,255,0 etc.
    Aber es klappt einfach nicht.

    Hier der Source Code:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Sub CmdEinlesen_Click(sender As Object, e As EventArgs) Handles CmdEinlesen.Click
    4. ' File Name
    5. Dim file_name As String = "C:\EIGENE_PROGRAMME\DataGridViewBR\TestMap.bmp"
    6. ' File öffnen
    7. Dim fs As New FileStream(file_name, FileMode.Open)
    8. ' BiaryReader Objekt für den FileStream erstellen
    9. Dim binary_reader As New BinaryReader(fs)
    10. fs.Position = 0
    11. ' Daten der Datei in Byte Array einlesen
    12. Dim bytes() As Byte = binary_reader.ReadBytes(fs.Length)
    13. For i As Integer = 0 To bytes.Length
    14. DgvDaten.Rows.Add(bytes(i))
    15. Next
    16. binary_reader.Close()
    17. fs.Dispose()
    18. End Sub
    19. End Class


    Der Einfachheit halber habe ich das Projekt samt der kleinen Bitmap (insgesamt ca. 170 KB) angehängt.

    Könntet Ihr mir da weiterhelfen?


    Viele Grüße und danke für Eure Mühe,
    Duster
    Dateien
    • DataGridViewBR.7z

      (142,83 kB, 71 mal heruntergeladen, zuletzt: )
    @Duster Was ganz genau soll denn im DGV angezeigt werden?
    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 RodFromGermany,

    danke für Deine schnelle Reaktion :thumbup:

    Jeder Pixel besitzt einen Farbwert z.B.: (255,0,0) oder (0,0,255) oder (0,255,0) usw..
    In jeder Zelle der 8 Spalten soll eins dieser Triplets also (255,0,0) oder (0,0,255) oder (0,255,0) usw. angezeigt werden.
    Das DGV enthät dann eine zahlenmässige Instanz der Pixel der Bitmap.

    | ... 1 ... |.... 2......|....<== HEADER............
    |255,0,255|0,255,255|....<== ZELLEN.............
    | .......... | .......... |....<== ZELLEN.............
    | .......... | .......... |....<== ZELLEN.............
    | .......... | .......... |....<== ZELLEN.............
    | .......... | .......... |....<== ZELLEN.............

    Bei den Spaltenüberschriften 1-8 handelt es sich um den 1., 2.,3.,4.,5.,6.,7.,8. Pixel der Bitmap von links nach rechts.
    Dann die nächste Zeile, eben falls 8 Zellen (Pixel) mit jeweils 3 Farbwerten (255,0,0) usw..

    Hab ich mich da konkret genug ausgedrückt? Wenn nicht dann frag einfach,
    nichts ist schlimmer und vermeidbarer als ein Kommunikationsproblem. :!:


    Viele Grüße und vielen Dank für Deine /Eure Mühe,
    Duster
    @Duster Dann musst Du das Byte-Array so als String formatieren, dass das raus kommt, was Du anzeigen willst.
    Das ist eine reine Fleißarbeit. ;)
    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!
    Guten Morgen

    So wie ich das jetzt verstanden habe, gibt es ein Bitmap 8x8 das in der DGV auf 8 Spalten und 8 Zeilen verteilt werden soll.
    Ich würde da ein Dataset verwenden. Das abspeichern der Bitmap kann man problemlos in Byte machen, muss dann aber je nachdem auch wieder kurz in ein Bitmap umgewandelt werden, damit die Pixel-Daten vorhanden sind. Und die kann man dann in ein Dataset eispielen. Das Dataset der DGV zuweisen.

    Und schon sind die Pixelwerte wie erwünscht in der DGV.

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Es fängt damit an, dass Du in Zeile#21 etwas anderes machst als Du denkst. Die Zeile sagt: "Füge dem DGV bytes(i)-viele Zeilen hinzu." Du willst aber nicht angeben, wieviele Zeilen, sondern welcher Inhalt. Der nächste Fehler ist ein Klassiker eine Zeile zuvor. Du gehst zu weit. Einen Schritt näher an der Wahrheit wäre:

    VB.NET-Quellcode

    1. For i As Integer = 0 To bytes.Length - 1
    2. DgvDaten.Rows.Add({bytes(i)})
    3. Next
    Die geschweiften Klammern führen dazu, dass eine andere .Add()-Überladung aufgerufen wird. Nämlich die, dass da Werte der einen neuen Zeile hinzugefügt werden. Ist immer noch nicht das gewünschte Endergebnis, aber besser als vorher.

    btw: Ggf. alternativ mit LockBits arbeiten? So mehr oder weniger aus dem Kopf heraus:

    VB.NET-Quellcode

    1. Dim Bitmap = DirectCast(Image.FromFile(Dateipfad), Bitmap)
    2. Dim Rectangle As New Rectangle(0, 0, Bitmap.Width, Bitmap.Height)
    3. Dim RawData = Bitmap.LockBits(Rectangle, Imaging.ImageLockMode.ReadOnly, ImageFormat) '*
    4. Dim StartPointer = RawData.Scan0
    5. Dim ByteCount = Math.Abs(RawData.Stride) * Bitmap.Height
    6. Dim ColorValues As Byte() = Nothing
    7. ReDim ColorValues(ByteCount - 1)
    8. Runtime.InteropServices.Marshal.Copy(StartPointer, ColorValues, 0, ByteCount)
    9. 'ColorValues ins DGV geben
    10. Bitmap.UnlockBits(RawData)

    Und dann hast Du in ColorValues alles drin.
    * siehe MSDN
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ehm ... nö. Was glaubst Du macht dieses gewünschte Format-Objekt? Wenn Du z.B. 4 einzelne Werte zu einem Zelleninhalt zusammenfassen willst, dann ergänze am Ende der For-Loop ein Step 4. Dadurch macht die Schleife 4er Sprünge. Und dann eben immer Byte(i), Byte(i + 1), Byte(i + 2) und Byte(i + 3) zusammen in einen String hauen. Schau mal dazu bei String.Join() vorbei.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das mit dem Format war ein Scherz :) , ich dachte es klappt mit einer verschachtelten Schleife.
    Krieg ich aber irgendwie auch net so wirklich geregelt.
    Step 3 nimmt doch nur jeden 3. Wert und nicht 3 Werte?

    Ich habe eine Teillösung. In jede Zelle wird EIN Wert geschrieben. Aber leider über den Umweg einer Liste :!:
    Weiß jemand wie ich diese Tellösung NUR mit einem Array d.h. ohne Liste realisiere :?:

    Hier der Source:

    VB.NET-Quellcode

    1. Dim Row As New List(Of String)
    2. For x As Integer = 56 To bytes.Count - 1
    3. If CBool(x Mod 8) Then
    4. Row.Add(bytes(x))
    5. End If
    6. If Row.Count = 8 Then
    7. DgvDaten.Rows.Add(Row.ToArray)
    8. Row.Clear()
    9. End If
    10. Next


    Viele Grüße und vielen Dank für deine Hilfe,
    Duster

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Duster“ ()

    Duster schrieb:

    Step 3 nimmt doch nur jeden 3. Wert und nicht 3 Werte?
    :?: Wer lesen kann, hat mehr Spaß im Leben:

    VaporiZed schrieb:

    dann ergänze am Ende der For-Loop ein Step 4. Dadurch macht die Schleife 4er Sprünge

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Duster schrieb:

    VB.NET-Quellcode

    1. If CBool(x Mod 8) Then
    machst Du

    VB.NET-Quellcode

    1. If (x Mod 8) = 0 Then
    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,

    ich bin einen Schritt weiter.
    Ich habe mir Eure Posts und das Prg. nochmal angesehen und folgende Lösung entwickelt.
    Das Grid wird jetzt mit 24 Spalten und 24 Zeilen gebaut d.h. für jeden Zahlenwert 255,0,0 eine Zelle also 3 Zellen pro Farbwert.
    Aber in den Zellen steht nun System.Byte[] anstatt lesbarer Zahlen ?(
    Was mach ich da falsch?

    In CmdEinlesen_Click(....):

    VB.NET-Quellcode

    1. ' 2_dimensionales Array initialisieren
    2. Dim bytes2(280, 280)
    3. Dim breite As Integer = 0
    4. Dim hoehe As Integer = 0
    5. ' Daten der Bitmap in 2_dimensionales Byte Array einlesen
    6. For hoehe = 0 To 279
    7. For breite = 0 To 279
    8. bytes2(breite, hoehe) = binary_reader.ReadBytes(fs.Length)
    9. Next
    10. Next
    11. ' BinaryReader schließen
    12. binary_reader.Close()
    13. fs.Dispose()
    14. ' Die ersten 23 Zeilen nund 23 Spalten des Arrays in DgvDaten schreiben
    15. For zeilen As Integer = 0 To 23
    16. DgvDaten.Rows.Add()
    17. For zellenAs Integer = 0 To 23
    18. DgvDaten.Rows(zeilen).Cells(zellen).Value = bytes2(zellen, spalten)
    19. Next
    20. Next


    in Form1_Load(....):

    VB.NET-Quellcode

    1. For spalte As Integer = 0 To 23
    2. DgvDaten.Columns.Add("Spalte" & (spalte + 1).ToString(), "Spalte" & (spalte + 1).ToString())
    3. Next



    Vielen Dank für Eure Mühe und Hilfe,
    Duster
    8| Das ist ja Option Strict Off!
    Zeile#2 deklariert ein Object-Array, da die Typangabe fehlt
    Z#10 Du liest in ein Objekt (was wohl dort ein Byte darstellen soll) ein ByteArray ein 8|
    Z#21 ist dank For zellenAs nicht kompilierbar, aber pillepalle. Aber spalten ist nicht deklariert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich steh echt auf dem Schlauch!!!!

    Hab ich zu viel oder zu blöd gefragt?

    Ich seh warscheinlich den Wald vor lauter Bäumen nicht! ;(

    O.K. hab begriffen woran alles lag, hab die Sache mit GetPixel gelöst :!:
    Das nächste mal auch mit Option Strict On :!:

    Kann der Admin diesen nutzlosen Thread löschen :!: :!: :?:

    Viele Grüße,
    Duster

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