izuki
5/18/2017 - 1:12 AM

Bitmapのファイルチェック

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_ */