Sto provando a creare una bitmap in C, solo dal codice. Attualmente sto cercando di creare un'immagine .bmp molto semplice, con un'altezza di 1 pixel e una larghezza di 4 pixel, con tutti i pixel bianchi. Ho letto la descrizione del formato e ho provato ad applicarlo. Ciò ha provocato il seguente codice:Creazione di un file BMP (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);
}
Quando provo ad aprire questa immagine, si dice che l'immagine è danneggiata. Mi sto perdendo qualcosa qui?
Ho anche notato che la codifica degli interi .bmp è little endian. Ho pensato che questo significa che devo invertire l'ordine dei byte. Ad esempio, 256 in quattro byte è: 00000000 00000000 00000001 00000000, e penso che in little endian questo sarebbe: 00000000 00000001 00000000 00000000
Qualcuno può darmi una mano qui? Sto usando un approccio corretto? Qualsiasi aiuto sarebbe apprezzato!
Grazie in anticipo!
Disegna un'immagine che desideri generare utilizzando il tuo editor grafico preferito, quindi prova a replicarla byte per byte. – dasblinkenlight
Hai sbagliato l'endianità nei campi della risoluzione. Troverai il tuo lavoro molto più semplice se scrivi funzioni di supporto per prendere interi a 2 e 4 byte e li impacchetta nel tuo array di byte. –
dasblinkenlight, ho provato a farlo in Pixelmator (su Mac), ma ho ottenuto un file bmp di 84 byte mentre mi aspetto che sia 66 byte, forse posso provare ad aprirlo con un programma che mi mostra byte per byte;) – Devos50