//--------------------------------------------------------------------------------------
//概要		: “簡単な”画像ファイルを読み込み、グレースケールに変換するプログラム
//			: 入力ファイルの形式はRGBビットマップ（.bmp）形式とする。
//			: また、画像のサイズは既知とする。
//File Name	: readandgrayscale.h
//--------------------------------------------------------------------------------------

#include <stdio.h>

#define LENGTH_FILEHEADER 14	//	ファイルヘッダの長さ

FILE *fpSource;		//	入力画像を読み出すためのファイルポインタ
int imageWidth;		//	入力画像の横方向のサイズ
int imageHeight;	//	入力画像の縦方向のサイズ
byte *source;		//	入力画像のためのメモリ領域
byte *gray;			//	グレースケール変換された画像のためのメモリ領域

int readAndGrayscale() {

    //	データ読み込み用のバッファ。RGB各チャンネル用
    unsigned int r;
    unsigned int g;
    unsigned int b;

	if ( ( fpSource = fopen( "source.bmp" , "rb" ) ) == NULL ) {
		//	画像が見つからなかった場合
		printf( "画像が見つかりません\n" );
		return -1;
	}
    
    //	ファイル読み出し
    //	ビットマップファイルにおいて最初の14バイトはファイルヘッダなので、
    //	14バイトぶん読み進める
    fread( null, sizeof( byte ), LENGTH_FILEHEADER, fpSource );
        
    //	データ読み込み
    source = ( unsigned char * )malloc( 3 * imageWidth * imageHeight
                                     * sizeof( unsigned char ) );
    for( int y = 0; y < imageHeight; y++ ) {
        for( int x = 0; x < imageWidth; x++ ) {
            fread( &b, sizeof( unsigned char ), 1, fpSource );
            fread( &g, sizeof( unsigned char ), 1, fpSource );
            fread( &r, sizeof( unsigned char ), 1, fpSource );
            source[( x + y * imageWidth ) * 3 + 0] = b;
            source[( x + y * imageWidth ) * 3 + 1] = g;
            source[( x + y * imageWidth ) * 3 + 2] = r;
        }
    }

    //	ファイルをクローズ
    fclose( fpSource );

    //	画像のグレースケール変換
    for ( int y = 0; y < imageHeight; y++ ) {		//	画像の縦方向へのループ
        fo r( int x = 0; x < imageWidth; x++ ) {	//	画像の横方向へのループ
            gray[x + y * imageWidth] = ( source[( x + y * imageWidth ) * 3 + 0]
                                       + source[( x + y * imageWidth ) * 3 + 1]
                                       + source[( x + y * imageWidth ) * 3 + 2]) / 3;
        }
    }

    return 0;
}
