C言語でBMPファイルを読む02

̃Gg[͂ĂȃubN}[Nɒlj

BMPファイルのヘッダ情報を、標準出力とバイナリファイルに出力するコード。
前回ぶちあたった、エンディアンの問題はひとまずおいておくため、
標準出力時と、バイナリ出力時で明示的にデータの順序を逆にした。
コードは以下。

/*	BMPReader.exe BMPファイルを読む。現状ヘッダ情報のみ	*/
#include <stdio.h>
#include <Windows.h>
#define BufSize 100	/* とりあえず100byte	*/
int main(int argc,char *argv[])
{
unsigned long size_bmfh = 0;
unsigned long size_bmih = 0;
unsigned char buf[BufSize];
FILE *Rfp;
FILE *Wfp;
/*	BITMAPFILEHEADER構造体	*/
typedef	struct{
WORD	bfType;		/*	"BM"(0x424d)	*/
DWORD	bfSize;		/*	ファイルサイズ	*/
WORD	bfReserved1;/*	固定値0			*/
WORD	bfReserved2;/*	固定値0			*/
DWORD	bfOffBits;	/*	ファイル先頭~ビット配列までのoffset	*/
} BITMAPFILEHEADER_t;

/*	BITMAPINFOHEADER構造体	*/
typedef	struct	{
DWORD	biSize;			/*	構造体のサイズ		*/
LONG	biWidth;		/*	ビットマップの幅	*/
LONG	biHeitht;		/*	ビットマップの高さ	*/
WORD		biPlanes;	/*	固定値1(プレーンの数)*/
WORD	biBitCount;		/*	ピクセルあたりの色数(1,4,8,24)	*/
DWORD	biConpression;	/*	圧縮方式(0:非圧縮)	*/
DWORD	biSizeImage;	/*	ビットマップビットのサイズ(圧縮時のみ)	*/
LONG	biXPelsPerMeter;/*	水平方向解像度(pixel per meter)	*/
LONG	biYPelsPerMeter;/*	垂直方向解像度(pixel per meter)	*/
DWORD	biClrUsed;		/*	使用されている色数	*/
DWORD	biClrImportant;	/*	重要な色の数		*/
} BITMAPINFOHEADER_t;
#if 0
/*	RGBGUARD構造体	*/
typedef	struct{
BYTE	rgbBlue;	/*	青の強さ(0-255)	*/
BYTE	rgbGreen;	/*	緑の強さ(0-255)	*/
BYTE	rgbRED;		/*	赤の強さ(0-255)	*/
BYTE	rgbReserved;
} RGBGUARD_t;
#endif BITMAPFILEHEADER_t bmfh;
BITMAPINFOHEADER_t bmih;

/*	引数チェック	*/
if(argc != 2){
printf("usage : BMPReader.exe filenamen");
printf("filename : 読込対象ファイル名n");
return 1;
}
char* fname = argv[1];

/*	オープン	*/
if((Rfp = fopen(fname, "rb")) == NULL)return 0;
if((Wfp = fopen("result.bmp", "wb")) == NULL)return 0;

/*	BITMAPFILEHEADER構造体読込	*/
size_bmfh = (unsigned long)(fread( &amp;buf, sizeof(unsigned char), 14, Rfp));
/*	print文表示用	*/
bmfh.bfType			= WORD (buf[1] << 8 | buf[0]);
bmfh.bfSize			= DWORD(buf[5] << 24| buf[4] << 16 | buf[3] << 8 | buf[2]);
bmfh.bfReserved1	= WORD (buf[7] << 8 | buf[6]);
bmfh.bfReserved2	= WORD (buf[9] << 8 | buf[8]);
bmfh.bfOffBits		= DWORD(buf[13] << 24| buf[12] << 16 | buf[11] << 8 | buf[10]);
printf("BITMAPFILEHEADER(size=%d)n", size_bmfh);
printf("bfType          = 0x%04xn", bmfh.bfType);
printf("bfSize          = 0x%08xn", bmfh.bfSize);
printf("bfReserved1     = 0x%04xn", bmfh.bfReserved1);
printf("bfReserved2     = 0x%04xn", bmfh.bfReserved2);
printf("bfOffBits       = 0x%08xn", bmfh.bfOffBits);
/*	バイナリ書き込み用	*/
bmfh.bfType			= WORD (buf[0] << 8 | buf[1]);
bmfh.bfSize			= DWORD(buf[2] << 24| buf[3] << 16 | buf[4] << 8 | buf[5]);
bmfh.bfReserved1	= WORD (buf[6] << 8 | buf[7]);
bmfh.bfReserved2	= WORD (buf[8] << 8 | buf[9]);
bmfh.bfOffBits		= DWORD(buf[10] << 24| buf[11] << 16 | buf[12] << 8 | buf[13]);
fwrite( buf, sizeof( unsigned char ), size_bmfh, Wfp );

/*	BITMAPINFOHEADER構造体読込	*/
size_bmih = (unsigned long)(fread( &amp;buf, sizeof(unsigned char), sizeof(BITMAPINFOHEADER_t), Rfp));
/*	print文表示用	*/
bmih.biSize			= DWORD(buf[3] << 24| buf[2] << 16 | buf[1] << 8 | buf[0]);
bmih.biWidth		= LONG (buf[7] << 24| buf[6] << 16 | buf[5] << 8 | buf[4]);
bmih.biHeitht		= LONG (buf[11] << 24| buf[10] << 16 | buf[9] << 8 | buf[8]);
bmih.biPlanes		= WORD (buf[13] << 8 | buf[12]);
bmih.biBitCount		= WORD (buf[15] << 8 | buf[14]);
bmih.biConpression	= DWORD(buf[19] << 24| buf[18] << 16 | buf[17] << 8 | buf[16]);
bmih.biSizeImage	= DWORD(buf[23] << 24| buf[22] << 16 | buf[21] << 8 | buf[20]);
bmih.biXPelsPerMeter= LONG (buf[27] << 24| buf[26] << 16 | buf[25] << 8 | buf[24]);
bmih.biYPelsPerMeter= LONG (buf[31] << 24| buf[30] << 16 | buf[29] << 8 | buf[28]);
bmih.biClrUsed		= DWORD(buf[35] << 24| buf[34] << 16 | buf[33] << 8 | buf[32]);
bmih.biClrImportant	= DWORD(buf[39] << 24| buf[38] << 16 | buf[37] << 8 | buf[36]);
printf("BITMAPINFOHEADER(size=%d)n", size_bmih);
printf("biSize          = 0x%08xn", bmih.biSize);
printf("biWidth         = 0x%08xn", bmih.biWidth);
printf("biHeitht        = 0x%08xn", bmih.biHeitht);
printf("biPlanes        = 0x%04xn", bmih.biPlanes);
printf("biBitCount      = 0x%04xn", bmih.biBitCount);
printf("biConpression   = 0x%08xn", bmih.biConpression);
printf("biSizeImage     = 0x%08xn", bmih.biSizeImage);
printf("biXPelsPerMeter = 0x%08xn", bmih.biXPelsPerMeter);
printf("biYPelsPerMeter = 0x%08xn", bmih.biYPelsPerMeter);
printf("biClrUsed       = 0x%08xn", bmih.biClrUsed);
printf("biClrImportant  = 0x%08xn", bmih.biClrImportant);
/*	バイナリ書き込み用	*/
bmih.biSize			= DWORD(buf[0] << 24| buf[1] << 16 | buf[2] << 8 | buf[3]);
bmih.biWidth		= LONG (buf[4] << 24| buf[5] << 16 | buf[6] << 8 | buf[7]);
bmih.biHeitht		= LONG (buf[8] << 24| buf[9] << 16 | buf[10] << 8 | buf[11]);
bmih.biPlanes		= WORD (buf[12] << 8 | buf[13]);
bmih.biBitCount		= WORD (buf[14] << 8 | buf[15]);
bmih.biConpression	= DWORD(buf[16] << 24| buf[17] << 16 | buf[18] << 8 | buf[19]);
bmih.biSizeImage	= DWORD(buf[20] << 24| buf[21] << 16 | buf[22] << 8 | buf[23]);
bmih.biXPelsPerMeter= LONG (buf[24] << 24| buf[25] << 16 | buf[26] << 8 | buf[27]);
bmih.biYPelsPerMeter= LONG (buf[28] << 24| buf[29] << 16 | buf[30] << 8 | buf[31]);
bmih.biClrUsed		= DWORD(buf[32] << 24| buf[33] << 16 | buf[34] << 8 | buf[35]);
bmih.biClrImportant	= DWORD(buf[36] << 24| buf[37] << 16 | buf[38] << 8 | buf[39]);
fwrite( buf, sizeof( unsigned char ), size_bmih, Wfp );

/*	クローズ	*/
fclose(Wfp);
fclose(Rfp);

return 0;
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です