Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menulis Imej BMP daripada Matriks Boolean dalam C/C Tulen?

Bagaimana untuk Menulis Imej BMP daripada Matriks Boolean dalam C/C Tulen?

Barbara Streisand
Barbara Streisandasal
2024-12-19 09:06:10241semak imbas

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

Menulis Imej BMP dalam C/C Tulen Tanpa Perpustakaan Luaran

Apabila mencipta output dengan matriks boolean, keperluan untuk menulisnya ke dalam fail BMP timbul. Ini melibatkan penciptaan imej monokrom dengan piksel bertanda putih jika elemen matriks yang sepadan adalah benar. Cabaran kekal dalam memahami struktur pengepala BMP dan proses penulisannya.

Untuk menangani perkara ini, penyelesaian melibatkan mencipta tiga tatasusunan 2D: merah, hijau dan biru, setiap satu mewakili nilai piksel berdasarkan matriks. Kod berikut menunjukkan pendekatan:

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

Pendekatan ini menyediakan penyelesaian menyeluruh untuk menulis fail BMP daripada matriks boolean, tanpa bergantung pada perpustakaan luaran. Struktur pengepala ditakrifkan dengan teliti dan kod tersebut memastikan pemformatan dan padding piksel yang betul, menghasilkan imej BMP yang sah yang boleh dibuka oleh penonton imej standard.

Atas ialah kandungan terperinci Bagaimana untuk Menulis Imej BMP daripada Matriks Boolean dalam C/C Tulen?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn