当前位置:C++技术网 > 资讯 > C语言代码验证图片内部存储信息

C语言代码验证图片内部存储信息

更新时间: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中。

剩下的也是一样的步骤,你自己好好断点调试一次就行了