Ich versuche, eine Bitmap in C nur aus Code zu erstellen. 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 dem folgenden Code:Erstellen einer BMP-Datei (Bitmap) in C
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, heißt es, dass das Bild beschädigt ist. Fehle ich hier etwas?
Ich habe auch festgestellt, dass die Kodierung der .bmp Integer ist Little Endian. 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 das: 00000000 00000001 00000000 00000000
Kann mir jemand hier helfen? Benütze ich einen richtigen Ansatz? Jede Hilfe wäre willkommen!
Vielen Dank im Voraus!
Zeichnen Sie ein Bild, das Sie mit Ihrem bevorzugten Grafikeditor erstellen möchten, und versuchen Sie dann, es Byte für Byte zu replizieren. – dasblinkenlight
Sie haben die Endianness falsch in den Auflösungsfeldern. Sie werden Ihre Arbeit viel einfacher finden, wenn Sie Hilfsfunktionen schreiben, die 2-Byte- und 4-Byte-Ganzzahlen aufnehmen und sie für Sie in Ihr Byte-Array packen. –
dasblinkenlight, ich habe versucht, das in Pixelmator (auf dem Mac), aber ich habe eine bmp-Datei von 84 Bytes, während ich erwarte es 66 Bytes, vielleicht kann ich versuchen, es mit einem Programm, das zeigt mir Byte pro zeigt byte;) – Devos50