bambooflow Note

Bitmap

最終更新:

bambooflow

- view
メンバー限定 登録/ログイン

ビットマップ

ビットマップ形式をC言語で処理するメモ。


ビットマップ(bmp)のファイル出力



#include <cstdio>
 
int main( int argc, char* argv[] )
{
    typedef unsigned char  BYTE;
    typedef unsigned short WORD;
    typedef unsigned long  DWORD;
    typedef long           LONG;
 
    int x_size = 100;
    int y_size = 200;
 
    int pad = (x_size*3+3)/4 * 4 - x_size*3;
    int imgsize = (x_size*3 + pad) * y_size;
 
    WORD  bfType = *(WORD*)"BM"; // "BM"
    DWORD bfSize = imgsize + 14 + 40; // fileHeaderSize + fileInfoSize
    WORD  bfReserved1 = 0;
    WORD  bfReserved2 = 0;
    DWORD bfOffBits   = 14 + 40; // fileHeaderSize + fileInfoSize
    DWORD biSize = 40; // fileInfoSize
    LONG  biWidth = x_size;
    LONG  biHeight = y_size;
    WORD  biPlanes = 1;
    WORD  biBitCount = 24;
    DWORD biCompression = 0;
    DWORD biSizeImage = imgsize;
    LONG  biXPelsPerMeter = 0;
    LONG  biYPelsPerMeter = 0;
    DWORD biClrUsed = 0;
    DWORD biClrImportant = 0;
 
    FILE *fp;
    fp = fopen( "abc.bmp", "wb" )
 
    fwrite( &bfType, sizeof(WORD), 1, fp );
    fwrite( &bfSize, sizeof(DWORD), 1, fp );
    fwrite( &bfReserved1, sizeof(WORD), 1, fp );
    fwrite( &bfReserved2, sizeof(WORD), 1, fp );
    fwrite( &bfOffBits, sizeof(DWORD), 1, fp );
    fwrite( &biSize, sizeof(DWORD), 1, fp );
    fwrite( &biWidth, sizeof(LONG), 1, fp );
    fwrite( &biHeight, sizeof(LONG), 1, fp );
    fwrite( &biPlanes, sizeof(WORD), 1, fp );
    fwrite( &biBitCount, sizeof(WORD), 1, fp );
    fwrite( &biCompression, sizeof(DWORD), 1, fp );
    fwrite( &biSizeImage, sizeof(DWORD), 1, fp );
    fwrite( &biXPelsPerMeter, sizeof(LONG), 1, fp );
    fwrite( &biYPelsPerMeter, sizeof(LONG), 1, fp );
    fwrite( &biClrUsed, sizeof(DWORD), 1, fp );
    fwrite( &biClrImportant, sizeof(DWORD), 1, fp );
 
    unsigned char *buf = new unsigned char[imgsize];
 
    for (int i=0; i<imgsize; i++) {
        buf[i] = 0x55;
    }
 
    fwrite( buf, 1, imgsize, fp );
 
    fclose( fp );
}
 


構造体作ってfwriteしたかったんだけど、なぜかheaderのバイト数が合わなくなってしまうのでやめた。

タグ:

C言語
記事メニュー
ウィキ募集バナー