// // コンピュータグラフィックスS // ビットマップ画像の読み込み関数 // #ifdef WIN32 #include #pragma warning( disable: 4996 ) #else // Linuxでコンパイルするための Windows BMP 構造体の定義 typedef unsigned short WORD; typedef unsigned long DWORD; typedef long LONG; typedef unsigned char BYTE; #define FAR typedef struct tagBITMAPINFOHEADER{ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER; typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } __attribute__((__packed__)) BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER; typedef struct tagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD; #endif // _WIN32_ #include #include "bitmap.h" // // ビットマップ画像の読み込み関数 // (24bit or 8bit(グレースケール)形式のビットマップ画像ファイルにのみ対応) // /** *** @param file_name 入力:読み込むBMPファイル名 *** @param bmp_data 出力:読み込んだ画像データの格納領域のポインタ [bmp_width(fixed_width) * bmp_height * 3] *** @param bmp_width 出力:読み込んだ画像データの幅 *** @param bmp_height 出力:読み込んだ画像データの高さ *** @result 成功したら 0 を返す。 **/ int loadBitmap( const char * file_name, unsigned char ** bmp_data, int * bmp_width, int * bmp_height ) { FILE * fp; BITMAPINFOHEADER bmpih; BITMAPFILEHEADER bmpfh; int width, height; int byte; unsigned char * data; int i, j, k; unsigned char r, g, b, dummy; unsigned char * p; int * bmp_bits = NULL; int fixed_width = -1; // ファイルをオープン fp = fopen( file_name, "rb" ); if ( fp == NULL ) return -1; // ヘッダの読み込み fread( &bmpfh, sizeof(BITMAPFILEHEADER), 1, fp); fread( &bmpih, sizeof(BITMAPINFOHEADER), 1, fp); // 画像サイズ・各ピクセルのデータサイズの取得 width = bmpih.biWidth; height = bmpih.biHeight; if ( ( bmpih.biBitCount != 24 ) && ( bmpih.biBitCount != 8 ) ) { fclose(fp); return -2; } byte = bmpih.biBitCount / 8; // 画像を読み込むデータ配列を初期化 if ( fixed_width > 0 ) data = (unsigned char *) malloc( sizeof( unsigned char ) * fixed_width * height * byte ); else data = (unsigned char *) malloc( sizeof( unsigned char ) * width * height * byte ); // 8ビットカラーの場合はパレット分を読み込み(グレースケールと仮定してパレットデータは破棄) if ( byte == 1 ) { for ( i=0; i<256*4; i++ ) fread( &dummy, 1, 1, fp ); } // 画像データの読み込み(各ピクセルごとに読み込んだデータを配列に格納) for ( i=0; i 0 ) && ( width < fixed_width ) ) p = &data[ ( height - i - 1 ) * fixed_width * byte ]; else p = &data[ ( height - i - 1 ) * width * byte ]; // 各ピクセルのデータを読み込み for ( j=0; j