Écriture d'une image BMP en C/C pur sans bibliothèques externes
Lors de la création d'une sortie avec une matrice booléenne, la nécessité de l'écrire dans un fichier BMP apparaît. Cela implique de créer une image monochrome avec des pixels marqués en blanc si l'élément matriciel correspondant est vrai. Le défi reste de comprendre la structure de l'en-tête BMP et son processus d'écriture.
Pour résoudre ce problème, une solution consiste à créer trois tableaux 2D : rouge, vert et bleu, chacun représentant des valeurs de pixels basées sur la matrice. Le code suivant illustre l'approche :
FILE *f; unsigned char *img = NULL; int filesize = 54 + 3 * w * h; // Width and height represented as w and h img = (unsigned char *)malloc(3 * w * h); memset(img, 0, 3 * w * h); for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { int x = i, y = (h - 1) - j; // Flipping the image vertically int r = red[i][j] * 255; int g = green[i][j] * 255; int b = blue[i][j] * 255; // Clamping RGB values between 0-255 if (r > 255) r = 255; if (g > 255) g = 255; if (b > 255) b = 255; img[(x + y * w) * 3 + 2] = (unsigned char)(r); img[(x + y * w) * 3 + 1] = (unsigned char)(g); img[(x + y * w) * 3 + 0] = (unsigned char)(b); } } // Define BMP headers unsigned char bmpfileheader[14] = {'B', 'M', 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0}; unsigned char bmpinfoheader[40] = {40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0}; unsigned char bmppad[3] = {0, 0, 0}; // Populate BMP header values bmpfileheader[2] = (unsigned char)(filesize); bmpfileheader[3] = (unsigned char)(filesize >> 8); bmpfileheader[4] = (unsigned char)(filesize >> 16); bmpfileheader[5] = (unsigned char)(filesize >> 24); bmpinfoheader[4] = (unsigned char)(w); bmpinfoheader[5] = (unsigned char)(w >> 8); bmpinfoheader[6] = (unsigned char)(w >> 16); bmpinfoheader[7] = (unsigned char)(w >> 24); bmpinfoheader[8] = (unsigned char)(h); bmpinfoheader[9] = (unsigned char)(h >> 8); bmpinfoheader[10] = (unsigned char)(h >> 16); bmpinfoheader[11] = (unsigned char)(h >> 24); f = fopen("img.bmp", "wb"); fwrite(bmpfileheader, 1, 14, f); fwrite(bmpinfoheader, 1, 40, f); for (int i = 0; i < h; i++) { fwrite(img + (w * (h - i - 1) * 3), 3, w, f); fwrite(bmppad, 1, (4 - (w * 3) % 4) % 4, f); // Padding to ensure 4-byte alignment } free(img); fclose(f);
Cette approche fournit une solution complète pour écrire un fichier BMP à partir d'une matrice booléenne, sans recourir à des bibliothèques externes. La structure de l'en-tête est méticuleusement définie et le code garantit un formatage et un remplissage des pixels appropriés, ce qui donne lieu à une image BMP valide qui peut être ouverte par les visionneuses d'images standard.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!