ホームページ >バックエンド開発 >C++ >Pure C/C でブール行列から BMP イメージを書き込む方法

Pure C/C でブール行列から BMP イメージを書き込む方法

Barbara Streisand
Barbara Streisandオリジナル
2024-12-19 09:06:10241ブラウズ

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

外部ライブラリを使用せずに Pure C/C で BMP イメージを書き込む

ブール行列を使用して出力を作成する場合、それを書き込む必要があります。 BMPファイルが生成されます。これには、対応する行列要素が true の場合に、ピクセルが白でマークされたモノクロ画像を作成することが含まれます。 BMP ヘッダーの構造とその書き込みプロセスを理解することが課題として残っています。

これに対処するための解決策には、赤、緑、青の 3 つの 2D 配列を作成することが含まれます。各配列はマトリックスに基づいてピクセル値を表します。次のコードは、このアプローチを示しています。

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

このアプローチは、外部ライブラリに依存せずに、ブール行列から BMP ファイルを作成するための包括的なソリューションを提供します。ヘッダー構造は細心の注意を払って定義されており、コードによって適切なピクセル形式とパディングが保証され、標準の画像ビューアで開くことができる有効な BMP 画像が生成されます。

以上がPure C/C でブール行列から BMP イメージを書き込む方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。