Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mencipta Imej BMP Monokromatik daripada Matriks Boolean dalam C/C Tulen Tanpa Pustaka Luaran?

Bagaimana untuk Mencipta Imej BMP Monokromatik daripada Matriks Boolean dalam C/C Tulen Tanpa Pustaka Luaran?

DDD
Lepaskan: 2024-11-29 17:16:10
asal
576 orang telah melayarinya

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

Menulis Imej BMP dalam C/C Tulen Tanpa Perpustakaan Luaran

Apabila membangunkan algoritma yang memerlukan output maklumat, ia menjadi perlu untuk menjana output dalam pelbagai format. Satu format biasa ialah imej BMP. Artikel ini menangani masalah mencipta imej BMP monokromatik daripada matriks boolean, di mana unsur benar diwakili sebagai piksel putih.

Struktur Pengepala BMP

A BMP (Bitmap Fail imej) terdiri daripada bahagian pengepala diikuti dengan data imej. Pengepala mengandungi maklumat penting tentang dimensi imej, kedalaman warna dan format mampatan. Berikut ialah pecahan komponen utama:

  • Tandatangan "BM": Mengenal pasti fail sebagai imej BMP (2 bait).
  • Saiz fail: Saiz fail BMP dalam bait (4 bait).
  • Mengimbangi kepada data piksel: Lokasi data imej dalam fail (4 bait).
  • BITMAPINFOHEADER: Mengandungi maklumat tambahan tentang imej, seperti lebar, ketinggian, bilangan satah warna dan kedalaman bit (40 bait).

Kod untuk Menjana Imej BMP daripada Boolean Matrix

Coretan kod berikut menunjukkan cara mencipta imej BMP daripada matriks boolean tanpa bergantung pada perpustakaan luaran:

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);
Salin selepas log masuk

Dengan mengikut langkah-langkah yang digariskan dalam kod ini, anda boleh berjaya menjana imej BMP monokromatik daripada matriks boolean, memberikan cara untuk menggambarkan dan mengeluarkan hasil algoritma anda.

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

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan