Le format de fichier bitmap est plutôt compliqué. Ce n'est pas la meilleure façon d'apprendre C. Il vaut mieux commencer par quelque chose de beaucoup plus simple. Cela dit, le format bitmap commence par une structure bitmap BITMAPFILEHEADER
de 14 octets de long, suivie de BITMAPINFOHEADER
structure de 40 octets. Ces structures sont définies dans "Windows.h"
Vous devez écrire diverses informations dans ces structures et les écrire dans un fichier avant d'écrire les pixels réels.
Vous pouvez avoir un bitmap 1, 4, 8, 16, 24 et 32 bits. Ceci est un exemple pour lire un bitmap 32 bits. Ce code suppose sizeof(short)
est 2, sizeof(int)
est 4.
int main()
{
int row, column;
int width = 100;
int height = 100;
int size = width * height * 4; //for 32-bit bitmap only
char header[54] = { 0 };
strcpy(header, "BM");
memset(&header[2], (int)(54 + size), 1);
memset(&header[10], (int)54, 1);//always 54
memset(&header[14], (int)40, 1);//always 40
memset(&header[18], (int)width, 1);
memset(&header[22], (int)height, 1);
memset(&header[26], (short)1, 1);
memset(&header[28], (short)32, 1);//32bit
memset(&header[34], (int)size, 1);//pixel size
unsigned char *pixels = malloc(size);
for(row = height - 1; row >= 0; row--) {
for(column = 0; column < width; column++) {
int p = (row * width + column) * 4;
pixels[p + 0] = 64; //blue
pixels[p + 1] = 128;//green
pixels[p + 2] = 192;//red
}
}
FILE *fout = fopen("32bit.bmp", "wb");
fwrite(header, 1, 54, fout);
fwrite(pixels, 1, size, fout);
free(pixels);
fclose(fout);
return 0;
}
Notez le premier pixel est bleu, suivi du vert et lire. Le dernier pixel n'est pas utilisé dans le bitmap 32 bits. Aussi la hauteur va de bas en haut. Ceci est une autre caractéristique étrange de bitmap. Les bitmaps 24 bits sont plus compliqués car ils nécessitent un remplissage. 8 bits et moins auront besoin d'une palette supplémentaire.
struct rgb_data {
float r, g, b;
};
float
n'est pas le bon type de pixels. Chaque couleur va de 0 à 255. Cela correspond à unsigned char
. Vous avez besoin au lieu
struct rgb_data {
unsigned r, g, b, alpha;
};
L'alpha est l'octet supplémentaire pour bitmap 32 bits (que nous n'utiliserons pas). Notez la taille de cette structure est 4. Vous pouvez attribuer cela comme
struct rgb_data *rgb = malloc(size);
Maintenant, vous pouvez accéder aux pixels comme suit:
int p = (row * width + column);
rgb[p].r = 255;
rgb[p].g = 0;
rgb[p].b = 0;
...
fwrite(rgb, 4, width * height, fout);
Votre type est 'struct rgb_data', faire la déclaration struct une typedef approprié. – orhtej2
Quand vous dites '' gcc -Wall testc o app'', ne voulez-vous pas dire '' gcc -Wall test.c -o app''? Si c'est le cas, lancez l'application en tant que './App'. –
C n'a pas 'new'. Je pense que vous mélangez un peu de C++. –