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

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

DDD
Libérer: 2024-12-10 07:49:09
original
541 Les gens l'ont consulté

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

Création d'une image BMP monochromatique en Pure C/C

Les fichiers d'images bitmap sont largement utilisés pour stocker des images numériques. Cet article répond à la nécessité d'écrire une matrice booléenne dans un fichier BMP monochrome, où les pixels sont définis en blanc si l'élément de matrice correspondant est vrai.

Comprendre l'en-tête BMP

Le format de fichier BMP a une structure d'en-tête spécifique qui contient des informations essentielles sur l'image. L'en-tête se compose de deux parties : l'en-tête du fichier et l'en-tête d'information.

L'en-tête du fichier

  • Taille (14 octets) : La taille du fichier en octets.
  • Identifiant (2 octets) :Le signature "BM" pour identifier le fichier comme un BMP.
  • Réservé (4 octets) : Réservé pour une utilisation future (mis à zéro).
  • Offset aux données de l'image (4 octets) : Le décalage en octets du début du fichier au début du pixel data.

L'en-tête d'information

  • Taille (40 octets) : La taille de l'en-tête d'information.
  • Largeur (4 octets) : La largeur de l'image en pixels.
  • Hauteur (4 octets) : La hauteur de l'image en pixels.
  • Plans (2 octets) : Toujours défini sur 1 .
  • Nombre de bits (2 octets) : 1 bit par pixel pour le monochrome images.
  • Compression (4 octets) : 0 pour les images non compressées.
  • Taille des données d'image (4 octets) : La taille du pixel données en octets.
  • XPelsPerMeter et YPelsPerMeter (4 octets chacun): Résolution horizontale et verticale de l'image en pixels par mètre.
  • Palette de couleurs (4 octets): Le nombre de couleurs dans la palette (fixé à 0 pour le monochrome images).
  • Couleurs importantes (4 octets) : Le nombre de couleurs importantes dans la palette (fixé à 0 pour le monochrome images).

Création du BMP monochrome

Pour créer le BMP monochrome :

  1. Calculez la taille du fichier et le décalage par rapport à les données de l'image.
  2. Initialisez l'en-tête du fichier et l'en-tête des informations avec le valeurs.
  3. Créez un tableau 2D de booléens représentant la matrice.
  4. Convertissez les valeurs booléennes en valeurs de pixels (0 pour faux et 255 pour vrai).
  5. Écrivez le fichier en-tête du fichier.
  6. Écrivez l'en-tête des informations dans le fichier.
  7. Itérer à travers les données de pixels et écrivez-les dans le fichier.
  8. Remplissez chaque ligne à un multiple de 4 octets pour garantir l'alignement.
  9. Fermez le fichier.

Exemple de code

Le code C/C suivant démontre la création d'un BMP monochrome à partir d'un booléen matrice :

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *f;
    unsigned char *img = NULL;
    int filesize = 54 + 3*w*h;  //w is your image width, h is image height, both int

    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++)
        {
            bool = matrix[i][j]
            x=i; y=(h-1)-j;
            r = bool? 255 : 0;
            g = bool? 255 : 0;
            b = bool? 255 : 0;
            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);
        }
    }

    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};

    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);
    }

    free(img);
    fclose(f);

    return 0;
}
Copier après la connexion

Ce code prend une matrice matricielle booléenne et crée une image BMP monochrome avec une largeur (w) et une hauteur (h) spécifiées. Il convertit les valeurs booléennes en valeurs de pixels et écrit le fichier BMP sur le disque.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal