Einlesereihenfolge von BitMap-Bytes

  • VB.NET

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

    Einlesereihenfolge von BitMap-Bytes

    Hallo zusammen,

    ich habe ein kleines Projekt (Option Strict ON) in dem ich mit Hilfe eines MemoryStreams eine Bitmap in ein eindimensionales Array lese. Aus diesem Array heraus zeige ich die Daten (momen nur die Farbwerte) in einem DataGridView an.
    Das funktioniert bis hierher auch sehr gut.
    Meine Testmap besteht aus 6 Pixeln in der 1. Zeile 3 Rotwerte ({255, 0, 0},{200, 0, 0}, {100, 0, 0}) in der 2. Zeile 3 Pixel mit dem gleichen Grünwert ({0, 255, 0}, {0, 255, 0}, {0, 255, 0}).

    In meinem Array bitmapBytes stehen die Farbwerte von unten nach oben d.h. es wird mit dem letzten Pixel der Bmp. angefangen und mit dem ersten Pixel der Bmp mit dem Einlesen aufgehört, da es sich um eine BottomUp Bitmap handelt (BitmapHeader Beschreibung WiKi).
    de.wikipedia.org/wiki/Windows_Bitmap

    Soweit ist mir alles klar aber es erscheinen 5 Nullen zwischen den Farbwerten der beiden Zeilen und eine am Ende die da eigentlich nicht hingehören. Hängt das mit dem Stream zusammen? Oder Baut MSPaint, das ich zur Erstellung der 6 Pixel benutzt habe Mist? Natürlich habe ich auch die Forensuche und Dr. Google genutzt, das Ein-und Auslesen vom Bmp's in Byte-Arrays ist auch häufiger ein Thema aber die Sache mit den Nullen hab ich bisher noch nicht gefunden.

    Ich habe zum besseren verständnis ein Bild angehängt:



    Und das ist mein Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Private Sub CmdEinlesen_Click(sender As Object, e As EventArgs) Handles CmdEinlesen.Click
    5. Dim Bild As Image = Image.FromFile("D:\PROGRAMMIERUNG\VISUAL_STUDIO\VISUAL_BASIC\DATA_GRID_VIEW\Dgv_Bmp_2DimArray\TestMap5.bmp")
    6. Dim bitmapBytes As Byte()
    7. Using stream As New System.IO.MemoryStream
    8. Bild.Save(stream, Bild.RawFormat)
    9. bitmapBytes = stream.ToArray
    10. End Using
    11. For i As Integer = 54 To bitmapBytes.Length - 1
    12. DgvDaten.Rows.Add({bitmapBytes(i)})
    13. Next
    14. End Sub
    15. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    16. For spalte As Integer = 0 To 23
    17. DgvDaten.Columns.Add("Spalte" & (spalte + 1), "Spalte" & (spalte + 1))
    18. Next
    19. End Sub
    20. End Class


    Das kleine Projekt hab ich ebenfalls angehängt!

    Hoffentlich könnt Ihr mir erklären wo die Nullen herkommen und was ich dagegen tun kann!


    Vielen Dank für Eure Mühe und Hilfe vorab :thumbup: ,
    Duster



    Dateien
    • BmpToBytes.zip

      (99,51 kB, 53 mal heruntergeladen, zuletzt: )
    @Duster Auch wenn Deine Bitmap nur 3 Spalten hat, wird die Anzahl der Spalten im internen Buffer stets so angelegt, dass die Anzahl der Bytes durch 4 teilbar ist.
    Bitmap-intern sind dei Farben in der Reihenfolge BGR abgelegt.
    Hast Du eine Bitmap, die im RGB24-Format abgelegt ist, würden pro Zeile 3 Byte eingeschoben werden. Bei einer RGB32-Bitmap ist dies nicht erforderlich.
    Da Du eine RGB24-Bitmap hast, sind nur die ersten 3 Deiner ???-Bytes Füllbytes, die letzten beiden gehören bereits zum nächsten Pixel im BGR-Format.
    Teste dies, indem Du mit Paint eine 3x2-Bitmap erstellst, wo Du geeignete Misch-Farben anlegst.
    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!
    @RodFromGermany
    Vielen Dank für Deine schnelle und kompetente Hilfe. :thumbsup: :thumbup:
    Wenn ich Dich richtig verstanden habe dann sind die letzten 3 Nullen hinter der 100 ebenfalls FüllBytes damit man auf 12 und somit ein vielfaches von 4 kommt BGR-Format!? Stimmt meine Aussage :?:

    Wärst Du so nett und würdest mir noch sagen was "geeignete" Mischfarben sind bzw. mir ein Beispiel dafür für geben :?:

    Viele Grüße und vielen Dank für Deine Mühe,
    Duster

    Duster schrieb:

    Stimmt meine Aussage
    Ja.
    Mach Dir in der ersten Zeile z.B. { 1, 2, 3 } und in der zweiten Zeile { 16, 17, 18 }.
    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!