Maison >développement back-end >C++ >Comment créer une image BMP monochromatique à partir d'une matrice booléenne en C/C pur sans bibliothèques externes ?

Comment créer une image BMP monochromatique à partir d'une matrice booléenne en C/C pur sans bibliothèques externes ?

DDD
DDDoriginal
2024-11-29 17:16:10522parcourir

How to Create a Monochromatic BMP Image from a Boolean Matrix in Pure C/C   Without External Libraries?

Écriture d'une image BMP en C/C pur sans bibliothèques externes

Lors du développement d'algorithmes nécessitant une sortie d'informations, il devient nécessaire de générer des sorties dans divers formats. Un format courant est une image BMP. Cet article aborde le problème de la création d'une image BMP monochromatique à partir d'une matrice booléenne, où les vrais éléments sont représentés sous forme de pixels blancs.

Structure d'en-tête BMP

Un BMP (Bitmap Image) se compose d’une section d’en-tête suivie des données d’image. L'en-tête contient des informations vitales sur les dimensions de l'image, la profondeur des couleurs et le format de compression. Voici une répartition des principaux composants :

  • Signature "BM" : Identifie le fichier comme une image BMP (2 octets).
  • Taille du fichier : Taille du fichier BMP en octets (4 octets).
  • Décalage par rapport aux données en pixels : emplacement des données d'image dans le fichier (4 octets).
  • BITMAPINFOHEADER : contient des informations supplémentaires sur l'image, telles que la largeur, la hauteur, le nombre de plans de couleur et la profondeur de bits (40 octets).

Code pour générer une image BMP à partir d'une matrice booléenne

L'extrait de code suivant montre comment créer une image BMP à partir d'un matrice booléenne sans recourir à des bibliothèques externes :

FILE *f;
unsigned char *img = NULL;
int filesize = 54 + 3*w*h;  // w and h are image width and height

// Allocate memory for image data
img = (unsigned char *)malloc(3*w*h);
memset(img,0,3*w*h);

// Fill img byte array with pixel data
for (int i = 0; i < w; i++) {
    for (int j = 0; j < h; j++) {
        int x = i, y = (h-1)-j;
        int r, g, b;  // Color components

        // Set pixel color based on matrix element
        if (matrix[i][j]) {
            r = g = b = 255;  // White pixel
        } else {
            r = g = b = 0;      // Black pixel
        }

        // Write pixel color components to image data array
        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);
    }
}

// Set BMP header values
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};

// Update file size
bmpfileheader[ 2] = (unsigned char)(filesize    );
bmpfileheader[ 3] = (unsigned char)(filesize>> 8);
bmpfileheader[ 4] = (unsigned char)(filesize>>16);
bmpfileheader[ 5] = (unsigned char)(filesize>>24);

// Update image width and height
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);

// Save BMP image to file
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);  // Pad to 4-byte boundary
}

// Free resources
free(img);
fclose(f);

En suivant les étapes décrites dans ce code, vous pouvez générer avec succès une image BMP monochromatique à partir d'une matrice booléenne, offrant ainsi un moyen de visualiser et de générer les résultats de votre algorithme.

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