Heim >Backend-Entwicklung >C++ >Wie schreibe ich ein BMP-Bild aus einer Booleschen Matrix in reinem C/C?

Wie schreibe ich ein BMP-Bild aus einer Booleschen Matrix in reinem C/C?

Barbara Streisand
Barbara StreisandOriginal
2024-12-19 09:06:10255Durchsuche

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

BMP-Bild in reinem C/C ohne externe Bibliotheken schreiben

Beim Erstellen einer Ausgabe mit einer booleschen Matrix besteht die Notwendigkeit, sie hineinzuschreiben Es entsteht eine BMP-Datei. Dabei wird ein monochromes Bild mit weiß markierten Pixeln erstellt, wenn das entsprechende Matrixelement wahr ist. Die Herausforderung besteht weiterhin darin, die BMP-Header-Struktur und ihren Schreibprozess zu verstehen.

Um dieses Problem zu lösen, besteht eine Lösung darin, drei 2D-Arrays zu erstellen: Rot, Grün und Blau, die jeweils Pixelwerte basierend auf der Matrix darstellen. Der folgende Code demonstriert den Ansatz:

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

Dieser Ansatz bietet eine umfassende Lösung zum Schreiben einer BMP-Datei aus einer booleschen Matrix, ohne auf externe Bibliotheken angewiesen zu sein. Die Header-Struktur ist sorgfältig definiert und der Code gewährleistet die richtige Pixelformatierung und -auffüllung, was zu einem gültigen BMP-Bild führt, das von Standard-Bildbetrachtern geöffnet werden kann.

Das obige ist der detaillierte Inhalt vonWie schreibe ich ein BMP-Bild aus einer Booleschen Matrix in reinem C/C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn