Bitmapのファイルチェック
#include <string.h> /* memcmp */
#include "bmp.h"
#define SUCCESS (0)
#define FAILURE (-1)
static int _BmpChecker(PUINT8 pBmpHeader8) {
int ret = SUCCESS;
int seek_size = sizeof(BITMAPFILEHEADER); /* 14 byte */
printf("_BmpChecker");
/* 引数チェック */
if(pBmpHeader == NULL){
printf("Not bmp data");
return FAILURE;
}
/* 共通ヘッダ */
if (memcmp("BM", pBmpHeader8, sizeof(UINT16)) != 0) {
printf("Not bmp data");
return FAILURE;
}
switch ( *(pBmpHeader8 + seek_size) ) {
case WINBMP_TYPE:
/* Windows */
BITMAPINFOHEADER* pBIH = (BITMAPINFOHEADER*)(pBmpHeader8 + seek_size);
if (!(pBIH->biBitCount == 1 || pBIH->biBitCount == 4 || pBIH->biBitCount == 8 || pBIH->biBitCount == 24 || pBIH->biBitCount == 32) ) {
printf("BMP File Format Error(BitCount=%d)", pBIH->biBitCount);
return FAILURE;
}
if ( !(pBIH->biCompression == 0 || pBIH->biCompression == 1 || pBIH->biCompression == 2 || pBIH->biCompression == 3) ) {
printf("BMP File Compression Error(Compression=%d)", pBIH->biCompression);
return FAILURE;
}
break;
case OS2BMP_TYPE:
BITMAPCOREHEADER* pBCH = (BITMAPCOREHEADER*)(pBmpHeader8 + seek_size); /* OS/2 */
if (!(pBCH->biBitCount == 1 || pBCH->biBitCount == 4 || pBCH->biBitCount == 8 || pBCH->biBitCount == 24 ) ) {
printf("BMP File Format Error(BitCount=%d)", pBCH->biBitCount);
return FAILURE;
}
break;
default:
printf("BMP File Format Error");
ret = FAILURE;
break;
}
return Result;
}
#ifndef __BMP_HEADER_FILE_
#define __BMP_HEADER_FILE_
/************************************************************************/
/* ファイル内定数定義 */
/************************************************************************/
typedef unsigned char UINT8;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef signed long LONG;
/************************************************************************/
/* 列挙体定義 */
/************************************************************************/
/* Bitmap Type */
typedef enum {
OS2BMP_TYPE = 12,
WINBMP_TYPE = 40,
} BMP_TYPE;
/************************************************************************/
/* 構造体定義 */
/************************************************************************/
/* Bitmap(共通ヘッダ) */
typedef struct tagBITMAPFILEHEADER {
WORD bfType; /* ファイルタイプ 'BM' - OS/2, Windows Bitmap */
DWORD bfSize; /* ファイルサイズ (byte) */
WORD bfReserved1; /* 予約領域 常に 0 */
WORD bfReserved2; /* 予約領域 常に 0 */
DWORD bfOffBits; /* ファイル先頭から画像データまでのオフセット (byte) */
} BITMAPFILEHEADER, *PBITMAPFILEHEADER; /* 14byte */
/* Bitmap(Winsowsヘッダ) */
typedef struct tagBITMAPINFOHEADER {
DWORD biSize; /* 情報ヘッダサイズ[40byte] */
LONG biWidth; /* 画像の幅[ピクセル] */
LONG biHeight; /* 画像の高さ[ピクセル] */
WORD biPlanes; /* プレーン数 常に1 */
WORD biBitCount; /* 色ビット数[bit] 1,4,8,(16),24,32 */
DWORD biCompression; /* 圧縮形式 0,1,2,3 */
DWORD biSizeImage; /* 画像データサイズ[byte] */
LONG biXPelsPerMeter; /* 水平解像度[dot/m] */
LONG biYPelsPerMeter; /* 垂直解像度[dot/m] */
DWORD biClrUsed; /* 格納パレット数[使用色数] */
DWORD biClrImportant; /* 重要なパレットのインデックス */
} BITMAPINFOHEADER; /* 40byte */
/* Bitmap(OS/2) */
typedef struct tagBITMAPCOREHEADER {
DWORD bcSize; /* 情報ヘッダサイズ[12byte] */
WORD bcWidth; /* 画像の幅 (ピクセル) */
WORD bcHeight; /* 画像の高さ (ピクセル) */
WORD bcPlanes; /* プレーン数 常に1 */
WORD bcBitCount; /* 1画素あたりのデータサイズ (bit) */
} BITMAPCOREHEADER, *PBITMAPCOREHEADER;
typedef struct __tagRgb{
UINT8 r;
UINT8 g;
UINT8 b;
}RGB_STRUCT;
typedef struct __tagBgr{
UINT8 b;
UINT8 g;
UINT8 r;
}BGR_STRUCT;
#endif /* __BMP_HEADER_FILE_ */