Erstellen einer BMP-Datei (Bitmap) in C

Ich versuche, eine Bitmap in C zu erstellen, nur aus Code. Ich versuche gerade, ein sehr einfaches .bmp-Bild mit einer Höhe von 1 Pixel und einer Breite von 4 Pixel mit allen weißen Pixeln zu erstellen. Ich habe die Formatbeschreibung gelesen und versucht, sie anzuwenden. Dies führte zu folgendem Code:

char bitmap[1000];

void BMPmake()
{
    // -- FILE HEADER -- //

    // bitmap signature
    bitmap[0] = 'B';
    bitmap[1] = 'M';

    // file size
    bitmap[2] = 66; // 40 + 14 + 12
    bitmap[3] = 0;
    bitmap[4] = 0;
    bitmap[5] = 0;

    // reserved field (in hex. 00 00 00 00)
    for(int i = 6; i < 10; i++) bitmap[i] = 0;

    // offset of pixel data inside the image
    for(int i = 10; i < 14; i++) bitmap[i] = 0;

    // -- BITMAP HEADER -- //

    // header size
    bitmap[14] = 40;
    for(int i = 15; i < 18; i++) bitmap[i] = 0;

    // width of the image
    bitmap[18] = 4;
    for(int i = 19; i < 22; i++) bitmap[i] = 0;

    // height of the image
    bitmap[22] = 1;
    for(int i = 23; i < 26; i++) bitmap[i] = 0;

    // reserved field
    bitmap[26] = 1;
    bitmap[27] = 0;

    // number of bits per pixel
    bitmap[28] = 24; // 3 byte
    bitmap[29] = 0;

    // compression method (no compression here)
    for(int i = 30; i < 34; i++) bitmap[i] = 0;

    // size of pixel data
    bitmap[34] = 12; // 12 bits => 4 pixels
    bitmap[35] = 0;
    bitmap[36] = 0;
    bitmap[37] = 0;

    // horizontal resolution of the image - pixels per meter (2835)
    bitmap[38] = 0;
    bitmap[39] = 0;
    bitmap[40] = 0b00110000;
    bitmap[41] = 0b10110001;

    // vertical resolution of the image - pixels per meter (2835)
    bitmap[42] = 0;
    bitmap[43] = 0;
    bitmap[44] = 0b00110000;
    bitmap[45] = 0b10110001;

    // color pallette information
    for(int i = 46; i < 50; i++) bitmap[i] = 0;

    // number of important colors
    for(int i = 50; i < 54; i++) bitmap[i] = 0;

    // -- PIXEL DATA -- //
    for(int i = 54; i < 66; i++) bitmap[i] = 0;
}

void BMPwrite()
{
    FILE *file;
    file = fopen("bitmap.bmp", "w+");
    for(int i = 0; i < 66; i++)
    {
        fputc(bitmap[i], file);
    }
    fclose(file);
}

Wenn ich versuche, dieses Bild zu öffnen, wird angezeigt, dass das Bild beschädigt ist. Vermisse ich hier etwas?

Mir ist auch aufgefallen, dass die Codierung der .bmp-Ganzzahlen Little Endian ist. Ich dachte, dass dies bedeutet, dass ich die Reihenfolge der Bytes umkehren muss. Zum Beispiel ist 256 in vier Bytes: 00000000 00000000 00000001 00000000, und ich denke, in Little Endian wäre dies: 00000000 00000001 00000000 00000000

Kann mir hier jemand helfen? Wende ich einen richtigen Ansatz an? Jede Hilfe wäre dankbar!

Danke im Voraus!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage