ビットマップ
ビットマップ形式を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のバイト数が合わなくなってしまうのでやめた。