Bitmap einlesen in C



  • Hallo Programmierfreaks der C-Welt! 🙂

    Bräuchte dringend eure Hilfe!!!

    Wie kann man eine BitMapDatei einlesen und auf 24 bit überprüfen?
    Brauch ich dafür auch das RGB-Triple?

    Bin für jede Hilfe dankbar!!! 🙂



  • Siehe: https://de.wikipedia.org/wiki/Windows_Bitmap

    Im Prinzip besteht eine BMP Datei aus dem Dateiheader, und danach kommt der Bitmap Header, und dann der Datenteil.

    Auf Offset 0x1C steht als 16bit Wert die Farbtiefe.

    Am besten du holst dir die ersten paar Byte der Datei in der Speicher, springst an Offset 0x1C in dem eingelesenen "Bytearray" und liest dort den Wert aus.



  • hmm...
    Danke dir!
    Aber so ganz blick ich leider noch immer nicht durch... 😞



  • Dann erkläre, was du nicht verstehst. Den Header- und Daten-Teil? Das Offset 0x1C?



  • Hier mal ein Tutorial:
    http://www.opengl-tutorial.org/beginners-tutorials/tutorial-5-a-textured-cube/
    Den OpenGL teil kannst du ja einfach weglassen.
    Funktioniert allerdings nicht mit jeder bmp Datei funktioniert, da es ja unterschiedliche Versionen von bmp Dateien gibt.

    floorball



  • kuckuck1000 schrieb:

    hmm...
    Danke dir!
    Aber so ganz blick ich leider noch immer nicht durch... 😞

    Die Bitmapdatei sieht so aus:

    +-------------------------+-------------------------+-----------------------+
    | BITMAPFILEHEADER=14byte | BITMAPINFOHEADER=40byte | Pixelwerte des Bildes |
    +-------------------------+-------------------------+-----------------------+
    

    Deine Infos stehen im BITMAPINFOHEADER.
    Du legst dir nun einen Buffer an:
    char buffer[54];
    Und in den Buffer kopierst du die ersten 54byte der Datei rein.

    Du öffnest die Datei mit fopen im Binärmodus "rb" zum Lesen.
    *FILE *fopen(const char *path, const char mode);

    Dann liest du mit fread den Dateiinhalt in den RAM, ptr zeigt auf deinen Buffer, size setzt du auf 1, nmemb setzt du auf die Anzahl der Byte die du einlesen willst (also 54) und stream ist die zuvor geöffnete Datei.
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

    Gut, du hast nun im Buffer die nötigen Daten.
    An Stelle 0x1C=28 stehen 2 Byte, die der Farbtiefe entsprechen.
    Du musst noch beachten, in welcher Reihenfolge die Byte zu interpretieren sind ("Endianness"). Die Farbtiefe ist also dann:
    *unsigned int farbtiefe=buffer[28]+buffer[29]256

    Hier mal eine Bitmap Datei im Hex Editor geöffnet.
    Wenn du die Stelle mit Offset 28 und 29 suchst, findest du dort den Wert 0x18 und 0x00, und im 10er System ist dann ganz einfach die Zahl 24, also Farbtiefe 24bit.
    >od -x test.bmp
    0000000 4d42 0046 0000 0000 0000 0036 0000 0028
    0000020 0000 0002 0000 0002 0000 0001 0018 0000
    0000040 0000 0010 0000 0b13 0000 0b13 0000 0000
    0000060 0000 0000 0000 00ff ff00 ffff 0000 0000
    0000100 0000 00ff 0000

    Jetzt alles klar?


Anmelden zum Antworten