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!