更新时间:2015-11-15 22:27:32浏览次数:1+次
在VS15中,新建一个C++项目,其中的核心代码如下:
void ReadBmpDemo()
{
CFile hFile;
hFile.Open(L"recvBmpData565.bmp",CFile::modeRead);//以打开的形式读取文件
//*******************************************
//***------Step 1:读取文件信息头---------****
//*******************************************
BITMAPFILEHEADER *pFileHead = NULL; // 位图文件的头指针
DWORD dwFileHeadSize = sizeof(BITMAPFILEHEADER);// 位图文件的头区域大小
pFileHead=(BITMAPFILEHEADER*)malloc(dwFileHeadSize);//申请一片dwFileHeadSize字节大小的内存区
hFile.Read(pFileHead,dwFileHeadSize);//从图片的文件当前位置读取一片内容:文件信息头
//*******************************************
//***------Step 2:读取位图信息头---------****
//*******************************************
BITMAPINFOHEADER *pBmpInfoHeader=NULL;
DWORD dwBmpInfoHeadSize=sizeof(BITMAPINFOHEADER);
pBmpInfoHeader=(BITMAPINFOHEADER*)malloc(dwBmpInfoHeadSize);//位图信息头
hFile.Read(pBmpInfoHeader,dwBmpInfoHeadSize);//读入第二块数据块
//*****************************************************
//***------Step 3:读取调色板信息或掩码部分---------****
//*****************************************************
RGBQUAD *pRgbQuad=NULL;
DWORD dwRgbQuadSize=3*sizeof(RGBQUAD);//本次实验的RGB565位图有三块掩码.
pRgbQuad=(RGBQUAD*)malloc(dwRgbQuadSize);
hFile.Read(pRgbQuad,dwRgbQuadSize);
//*****************************************************
//***------Step 4:读取位图的数据实体---------**********
//*****************************************************
BYTE *pBmpData=NULL;
//DWORD dwBmpDataSize=2*(pBmpInfoHeader->biWidth)*(pBmpInfoHeader->biHeight);//因为高度是负的,所以暂时不用此方法
DWORD dwBmpDataSize=(pFileHead->bfSize) - (pFileHead->bfOffBits);//文件头中的文件大小和数据实体偏移量之间的差
pBmpData=(BYTE*)malloc(dwBmpDataSize);//申请一片指定字节大小的内存区.
hFile.Read(pBmpData,dwBmpDataSize);
//**************************************************************
//***------Step 5:将RGB565的数据实体转成RGB555---------*********
//**************************************************************
//要加入代码--因为不属于本节讨论的内容,所以暂时没有加入
//*******************************************
//***------Step Final:释放动态内存区---------****
//*******************************************
free(pFileHead);
pFileHead=NULL;
free(pBmpInfoHeader);
pBmpInfoHeader=NULL;
free(pRgbQuad);
pRgbQuad=NULL;
free(pBmpData);
pBmpData=NULL;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
ReadBmpDemo();
}
return nRetCode;
}
断点调试验证:
程序代码运行到这里,pFileHead的声明定义,内存分配都已经完成了。接着下一步调试:
如图所示,经过
hFile.Read(pFileHead,dwFileHeadSize);//从图片的文件当前位置读取一片内容:文件信息头
这句代码的实现,成功的将图片的文件头信息读到了pFileHead中。
剩下的也是一样的步骤,你自己好好断点调试一次就行了
相关资讯