ホームページ >バックエンド開発 >C++ >Pure C/C でブール行列からモノクロ BMP イメージを作成する方法

Pure C/C でブール行列からモノクロ BMP イメージを作成する方法

DDD
DDDオリジナル
2024-12-10 07:49:09542ブラウズ

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

Pure C/C での単色 BMP イメージの作成

ビットマップ イメージ ファイルは、デジタル イメージの保存に広く使用されています。この記事では、ブール行列をモノクロ BMP ファイルに書き込む必要性について説明します。対応する行列要素が true の場合、ピクセルは白に設定されます。

BMP ヘッダーについて

BMP ファイル形式には、画像に関する重要な情報が含まれる特定のヘッダー構造があります。ヘッダーは、ファイル ヘッダーと情報ヘッダーの 2 つの部分で構成されます。

ファイル ヘッダー

  • サイズ (14 バイト): ファイルのサイズ (バイト単位)。
  • 識別子 (2) bytes): ファイルを BMP として識別する署名「BM」。
  • 予約 (4 バイト): 将来の使用のために予約 (0 に設定)。
  • 画像データへのオフセット (4 バイト): ファイルの先頭からファイルの先頭までのバイト単位のオフセット。ピクセル データ。

情報ヘッダー

  • サイズ (40 バイト): 情報ヘッダーのサイズ。
  • 幅 (4 バイト):ピクセル単位の画像。
  • 高さ (4 バイト): ピクセル単位の画像の高さ。
  • 平面 (2 バイト): 常に設定
  • ビット数 (2 バイト): 1モノクロ画像の場合はピクセルあたりのビット数。
  • 圧縮 (4 バイト): 非圧縮の場合は 0。
  • 画像データのサイズ (4 バイト):ピクセルデータのサイズbytes.
  • XPelsPerMeter および YPelsPerMeter (各 4 バイト): 画像の水平および垂直解像度 (ピクセル/メートル単位)。
  • カラー パレット (4 バイト) : パレット内の色の数 (モノクロの場合は 0 に設定します)画像).
  • 重要な色 (4 バイト): パレット内の重要な色の数 (モノクロ画像の場合は 0 に設定)。

モノクロBMPの作成

モノクロを作成するにはBMP:

  1. ファイル サイズと画像データへのオフセットを計算します。
  2. ファイル ヘッダーと情報ヘッダーを適切な値で初期化します。
  3. 次の 2D 配列を作成します。マトリックスを表すブール値。
  4. ブール値をピクセル値に変換します (false の場合は 0、255) true の場合)。
  5. ファイル ヘッダーをファイルに書き込みます。
  6. 情報ヘッダーをファイルに書き込みます。
  7. ピクセル データを反復処理してファイルに書き込みます。
  8. 確実に位置合わせするために、各行を 4 バイトの倍数にパディングします。
  9. file.

コード例

次の C/C コードは、ブール行列からモノクロ BMP を作成する方法を示しています。

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *f;
    unsigned char *img = NULL;
    int filesize = 54 + 3*w*h;  //w is your image width, h is image height, both int

    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++)
        {
            bool = matrix[i][j]
            x=i; y=(h-1)-j;
            r = bool? 255 : 0;
            g = bool? 255 : 0;
            b = bool? 255 : 0;
            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);
        }
    }

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

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

    free(img);
    fclose(f);

    return 0;
}

このコードはブール値行列を受け取り、指定された幅 (w) と高さ (h) のモノクロ BMP イメージを作成します。ブール値をピクセル値に変換し、BMP ファイルをディスクに書き込みます。

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

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