#include #include #include // Structure pour l'en-tête du fichier BMP #pragma pack(push, 1) struct BMPHeader { char signature[2]; int taille_fichier; int champ_reserve; int offset_donnees; }; #pragma pack(pop) // Structure pour l'en-tête DIB (Device Independent Bitmap) #pragma pack(push, 1) struct DIBHeader { int taille_dib; int largeur_img; int hauteur_img; short nb_plan; short nb_bit_par_pixel; int meth_compression; int taille_img; int resolusion_horizontale; int resolution_verticale; int nb_couleurs_palette; int nb_couleurs_importants; }; #pragma pack(pop) // Structure pour un pixel RGB #pragma pack(push, 1) struct RGBPixel { uint8_t bleu; uint8_t vert; uint8_t rouge; }; #pragma pack(pop) // Function to extraire les valeurs RGB depuis un pixel de 16-bit void extractRGB16(uint16_t pixel, uint8_t* rouge, uint8_t* vert, uint8_t* bleu) { *rouge = (pixel>> 11) & 0x1F; *vert = (pixel >> 5) & 0x3F; *bleu = pixel & 0x1F; } int main() { FILE* fichier = fopen("image.bmp", "rb"); // Remplacez "example.bmp" par le nom de votre fichier BMP if (fichier == NULL) { printf("Impossible d'ouvrir le fichier.\n"); return 1; } struct BMPHeader header; struct DIBHeader dibHeader; // Lecture de l'en-tête du fichier BMP fread(&header, sizeof(struct BMPHeader), 1, fichier); printf("Signature : %c%c\n", header.signature[0], header.signature[1]); printf("Taille du fichier : %d bytes\n", header.taille_fichier); printf("Offset des données : %d bytes\n", header.offset_donnees); // Lecture de l'en-tête DIB du fichier BMP fread(&dibHeader, sizeof(struct DIBHeader), 1, fichier); printf("Largeur de l'image : %d pixels\n", dibHeader.largeur_img); printf("Hauteur de l'image : %d pixels\n", dibHeader.hauteur_img); printf("Bits par pixel : %d\n", dibHeader.nb_bit_par_pixel); printf("Compression : %d\n", dibHeader.meth_compression); printf("Taille de l'image : %d\n", dibHeader.taille_img); printf("Nombre de couleurs de la palette : %d\n", dibHeader.nb_couleurs_palette); // Pointer sur le debut de l'image fseek(fichier, header.offset_donnees, SEEK_SET); // Lecture des 10 premiers pixels if (dibHeader.nb_bit_par_pixel ==24) { struct RGBPixel pixel; for (int i = 0; i < 10; i++) { fread(&pixel, sizeof(struct RGBPixel), 1, fichier); printf("Pixel %d - Rouge: %d, Vert: %d, Bleu: %d\n", i + 1, pixel.rouge, pixel.vert, pixel.bleu); } } else if (dibHeader.nb_bit_par_pixel ==16){ uint16_t pixels; uint8_t rouge, vert, bleu; for (int i = 0; i < 10; i++) { fread(&pixels, sizeof(uint16_t), 1, fichier); extractRGB16(pixels, &rouge, &vert, &bleu); printf("Pixel %d - Rouge: %d, Vert: %d, Bleu: %d\n", i + 1, rouge, vert, bleu); } } else { printf("Ce programme pend en charge uniquement les images 16 et 24 bits par pixel."); } // Fermeture du fichier fclose(fichier); return 0; }