1.bmp文件组成
bmp由文件头,位图信息头,颜色信息,图形信息组成。
文件头包含14个Byte:
{
type:2Byte;
size:4Byte;
reverse1:2Byte;
reverse2:2Byte;
offbits:4Byte;
}
位图信息头40Byte
{
size:4;width:4;height:4;
plane:2; bitcount:2;compression:4;sizeImage:4;
biXpels:4;biYpels:4;biClrUsed:4;biClrImportant:4;
}
2.数据读取
BITMAPFILEHEADER bfh;// bmp文件头
BITMAPINFOHEADER bih;// bmp头信息
FILE *f = fopen(strRgbFile.c_str(),"rb");
if (NULL == f)
{
GetLog().Log(0, LOG_INFO, "Open file error %s!", strRgbFile.c_str());
return PTN_ORIGINAL_FILE_OPEN_FAILED;
}
// 读取文件头
fread(&bfh,sizeof(bfh),1,f);
// 读取图像信息
fread(&bih,sizeof(bih),1,f);
int nBitCount = bih.biBitCount;
//读取数据信息
DWORD dwImageDataSize=bih.biSizeImage;
if(dwImageDataSize == 0)
{
dwImageDataSize = bih.biWidth*bih.biHeight*4;
}
if (bfh.bfType != 0x4d42 //限制只支持BMP,BMP图形正常
|| dwImageDataSize > 0x19000000) //限制BMP文件小于400MB
{
fclose(f);
f = NULL;
return PTN_ORIGINAL_FILE_SIZE_OVERFLOW;
}
//目前仅支持24bit BMP图片
if(24 != nBitCount)
{
fclose(f);
return PTN_ORIGINAL_FILE_NOT_SUPPORT;
}
BYTE * pData = new BYTE[dwImageDataSize];
memset(pData, 0, dwImageDataSize);
fseek(f,bfh.bfOffBits,SEEK_SET);
fread(pData, dwImageDataSize,1,f);
fclose(f);
f = NULL;