Maison >développement back-end >C++ >Comment écrire une image BMP à partir d'une matrice booléenne en Pure C/C ?

Comment écrire une image BMP à partir d'une matrice booléenne en Pure C/C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-19 09:06:10241parcourir

How to Write a BMP Image from a Boolean Matrix in Pure C/C  ?

É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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn