win7 64 位
使用 vs2010 创建一个 MFC工程 ,添加一个按钮,
在按钮的事件处理函数里面,添加如下代码:
void CBMP_HEAD_TESTDlg::OnBnClickedBtnReadBmp()
{
// TODO: 在此添加控件通知处理程序代码
OPENFILENAME ofn ;
static TCHAR szFileName [MAX_PATH], szTitleName [MAX_PATH] ;
static TCHAR szFilter[] = TEXT ("Bitmap Files (*.BMP)\0*.bmp\0")
TEXT ("All Files (*.*)\0*.*\0\0") ;
TCHAR tszTempPath[_MAX_PATH];
ZeroMemory(tszTempPath, MAX_PATH);
GetCurrentDirectory(MAX_PATH, tszTempPath);
ofn.lStructSize = sizeof (OPENFILENAME) ;
ofn.hwndOwner = NULL ;
ofn.hInstance = NULL ;
ofn.lpstrFilter = szFilter ;
ofn.lpstrCustomFilter = NULL ;
ofn.nMaxCustFilter = 0 ;
ofn.nFilterIndex = 0 ;
ofn.lpstrFile = szFileName ;
ofn.nMaxFile = MAX_PATH ;
ofn.lpstrFileTitle = szTitleName ;
ofn.nMaxFileTitle = MAX_PATH ;
ofn.lpstrInitialDir = tszTempPath ;
ofn.lpstrTitle = NULL ;
ofn.Flags = 0 ;
ofn.nFileOffset = 0 ;
ofn.nFileExtension = 0 ;
ofn.lpstrDefExt = TEXT ("bmp") ;
ofn.lCustData = 0 ;
ofn.lpfnHook = NULL ;
ofn.lpTemplateName = NULL ;
BOOL bRet = GetOpenFileName (&ofn);
if(!bRet){
return ;
}
printf("szFileName = %S\r\n",szFileName);
_tprintf(_T("%s\r\n"),szFileName);
TCHAR * szInfoName [] = { TEXT ("BITMAPCOREHEADER"),
TEXT ("BITMAPINFOHEADER"),
TEXT ("BITMAPV4HEADER"),
TEXT ("BITMAPV5HEADER") } ;
TCHAR * szCompression [] = { TEXT ("BI_RGB"), TEXT ("BI_RLE8"),
TEXT ("BI_RLE4"),
TEXT ("BI_BITFIELDS"),
TEXT ("unknown") } ;
BITMAPCOREHEADER * pbmch ;
BITMAPFILEHEADER * pbmfh ;
BOOL bSuccess ;
DWORD dwFileSize, dwHighSize, dwBytesRead ;
HANDLE hFile ;
int i ;
PBYTE pFile ;
TCHAR * szV ;
BITMAPINFOHEADER * pbmih ;
BITMAPV4HEADER *pbmihv4 ;
BITMAPV5HEADER *pbmihv5 ;
// Open the file
hFile = CreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Cannot open file.\r\n\r\n") ;
return ;
}
// Get the size of the file
dwFileSize = GetFileSize (hFile, &dwHighSize) ;
if (dwHighSize)
{
printf("Cannot deal with >4G files.\r\n\r\n") ;
CloseHandle (hFile) ;
return ;
}
// Allocate memory for the file
pFile = (PBYTE )malloc (dwFileSize) ;
if (!pFile)
{
printf("Cannot allocate memory.\r\n\r\n") ;
CloseHandle (hFile) ;
return ;
}
bSuccess = ReadFile (hFile, pFile, dwFileSize, &dwBytesRead, NULL) ;
if (!bSuccess || (dwBytesRead != dwFileSize))
{
printf("Could not read file.\r\n\r\n") ;
CloseHandle (hFile) ;
free (pFile) ;
return ;
}
CloseHandle (hFile) ;
printf("File size = %u bytes\r\n\r\n", dwFileSize) ;
// Display BITMAPFILEHEADER structure
pbmfh = (BITMAPFILEHEADER *) pFile ;
printf("BITMAPFILEHEADER\r\n") ;
printf("\t.bfType = 0x%X\r\n", pbmfh->bfType) ;
printf("\t.bfSize = %u\r\n", pbmfh->bfSize) ;
printf("\t.bfReserved1 = %u\r\n", pbmfh->bfReserved1) ;
printf("\t.bfReserved2 = %u\r\n", pbmfh->bfReserved2) ;
printf("\t.bfOffBits = %u\r\n\r\n", pbmfh->bfOffBits) ;
// Determine which information structure we have
DWORD InfoHeadSize = *((DWORD *)(pFile +sizeof (BITMAPFILEHEADER)));
printf("InfoHeadSize = %d\n",InfoHeadSize);
switch (InfoHeadSize)
{
case sizeof (BITMAPCOREHEADER): i = 0 ; break ;
case sizeof (BITMAPINFOHEADER): i = 1 ; szV = TEXT ("i") ; break ;
case sizeof (BITMAPV4HEADER): i = 2 ; szV = TEXT ("V4") ; break ;
case sizeof (BITMAPV5HEADER): i = 3 ; szV = TEXT ("V5") ; break ;
default:
printf("Unknown header size of %u.\r\n\r\n",
InfoHeadSize) ;
free (pFile) ;
return ;
}
printf("%S\r\n", szInfoName[i]) ;
_tprintf(_T("%s\r\n"),szInfoName[i]);
// Display the BITMAPCOREHEADER fields
if (InfoHeadSize == sizeof (BITMAPCOREHEADER))
{
pbmch = (BITMAPCOREHEADER *) pbmih ;
printf("\t.bcSize = %u\r\n", pbmch->bcSize) ;
printf("\t.bcWidth = %u\r\n", pbmch->bcWidth) ;
printf("\t.bcHeight = %u\r\n", pbmch->bcHeight) ;
printf("\t.bcPlanes = %u\r\n", pbmch->bcPlanes) ;
printf("\t.bcBitCount = %u\r\n\r\n", pbmch->bcBitCount);
free (pFile) ;
return ;
}
pbmih = (BITMAPINFOHEADER *) (pFile + sizeof (BITMAPFILEHEADER)) ;
// Display the BITMAPINFOHEADER fields
if (InfoHeadSize == sizeof (BITMAPINFOHEADER))
{
// Display the BITMAPINFOHEADER fields
pbmih = (BITMAPINFOHEADER *) pbmih ;
printf("\t.b%sSize = %u\r\n", szV, pbmih->biSize) ;
printf("\t.b%sWidth = %i\r\n", szV, pbmih->biWidth);
printf("\t.b%sHeight = %i\r\n", szV, pbmih->biHeight) ;
printf("\t.b%sPlanes = %u\r\n", szV, pbmih->biPlanes) ;
printf("\t.b%sBitCount = %u\r\n", szV, pbmih->biBitCount) ;
printf("\t.b%sCompression = %S\r\n", szV,
szCompression [min (4, pbmih->biCompression)]) ;
printf("\t.b%sSizeImage = %u\r\n", szV, pbmih->biSizeImage);
printf("\t.b%sXPelsPerMeter = %i\r\n", szV,
pbmih->biXPelsPerMeter) ;
printf("\t.b%sYPelsPerMeter = %i\r\n", szV,
pbmih->biYPelsPerMeter) ;
printf("\t.b%sClrUsed = %i\r\n", szV, pbmih->biClrUsed) ;
printf("\t.b%sClrImportant = %i\r\n\r\n", szV,
pbmih->biClrImportant) ;
free (pFile) ;
return ;
}
if (InfoHeadSize == sizeof (BITMAPV4HEADER))
{
// Display additional BITMAPV4HEADER fields
pbmihv4 = (BITMAPV4HEADER *) pbmih ;
// Display the BITMAPINFOHEADER fields
printf("\t.b%sSize = %u\r\n", szV, pbmihv4->bV4Size) ;
printf("\t.b%sWidth = %i\r\n", szV, pbmihv4->bV4Width);
printf("\t.b%sHeight = %i\r\n", szV, pbmihv4->bV4Height) ;
printf("\t.b%sPlanes = %u\r\n", szV, pbmihv4->bV4Planes) ;
printf("\t.b%sBitCount = %u\r\n", szV, pbmihv4->bV4BitCount) ;
printf("\t.b%sCompression = %S\r\n", szV,
szCompression [min (4, pbmihv4->bV4V4Compression)]) ;
printf("\t.b%sSizeImage = %u\r\n", szV, pbmihv4->bV4SizeImage);
printf("\t.b%sXPelsPerMeter = %i\r\n", szV,
pbmihv4->bV4XPelsPerMeter) ;
printf("\t.b%sYPelsPerMeter = %i\r\n", szV,
pbmihv4->bV4YPelsPerMeter) ;
printf("\t.b%sClrUsed = %i\r\n", szV, pbmihv4->bV4ClrUsed) ;
printf("\t.b%sClrImportant = %i\r\n\r\n", szV,
pbmihv4->bV4ClrImportant) ;
printf("\t.b%sRedMask = %08X\r\n", szV,
pbmihv4->bV4RedMask) ;
printf("\t.b%sGreenMask = %08X\r\n", szV,
pbmihv4->bV4GreenMask) ;
printf("\t.b%sBlueMask = %08X\r\n", szV,
pbmihv4->bV4BlueMask) ;
printf("\t.b%sAlphaMask = %08X\r\n", szV,
pbmihv4->bV4AlphaMask) ;
printf("\t.b%sCSType = %u\r\n", szV,
pbmihv4->bV4CSType) ;
printf("\t.b%sEndpoints.ciexyzRed.ciexyzX = %08X\r\n", szV,
pbmihv4->bV4Endpoints.ciexyzRed.ciexyzX) ;
printf("\t.b%sEndpoints.ciexyzRed.ciexyzY = %08X\r\n", szV,
pbmihv4->bV4Endpoints.ciexyzRed.ciexyzY) ;
printf("\t.b%sEndpoints.ciexyzRed.ciexyzZ = %08X\r\n", szV,
pbmihv4->bV4Endpoints.ciexyzRed.ciexyzZ) ;
printf("\t.b%sEndpoints.ciexyzGreen.ciexyzX = %08X\r\n", szV,
pbmihv4->bV4Endpoints.ciexyzGreen.ciexyzX) ;
printf("\t.b%sEndpoints.ciexyzGreen.ciexyzY = %08X\r\n", szV,
pbmihv4->bV4Endpoints.ciexyzGreen.ciexyzY) ;
printf("\t.b%sEndpoints.ciexyzGreen.ciexyzZ = %08X\r\n", szV,
pbmihv4->bV4Endpoints.ciexyzGreen.ciexyzZ) ;
printf("\t.b%sEndpoints.ciexyzBlue.ciexyzX = %08X\r\n", szV,
pbmihv4->bV4Endpoints.ciexyzBlue.ciexyzX) ;
printf("\t.b%sEndpoints.ciexyzBlue.ciexyzY = %08X\r\n", szV,
pbmihv4->bV4Endpoints.ciexyzBlue.ciexyzY) ;
printf("\t.b%sEndpoints.ciexyzBlue.ciexyzZ = %08X\r\n", szV,
pbmihv4->bV4Endpoints.ciexyzBlue.ciexyzZ) ;
printf("\t.b%sGammaRed = %08X\r\n", szV,
pbmihv4->bV4GammaRed) ;
printf("\t.b%sGammaGreen = %08X\r\n", szV,
pbmihv4->bV4GammaGreen) ;
printf("\t.b%sGammaBlue = %08X\r\n\r\n", szV,
pbmihv4->bV4GammaBlue) ;
free (pFile) ;
return ;
}
if (InfoHeadSize == sizeof (BITMAPV5HEADER)){
// Display additional BITMAPV5HEADER fields
pbmihv5 = (BITMAPV5HEADER *) pbmih ;
printf("\t.b%sSize = %u\r\n", szV, pbmihv5->bV5Size) ;
printf("\t.b%sWidth = %i\r\n", szV, pbmihv5->bV5Width);
printf("\t.b%sHeight = %i\r\n", szV, pbmihv5->bV5Height) ;
printf("\t.b%sPlanes = %u\r\n", szV, pbmihv5->bV5Planes) ;
printf("\t.b%sBitCount = %u\r\n", szV, pbmihv5->bV5BitCount) ;
printf("\t.b%sCompression = %S\r\n", szV,
szCompression [min (4, pbmihv5->bV5Compression)]) ;
printf("\t.b%sSizeImage = %u\r\n", szV, pbmihv5->bV5SizeImage);
printf("\t.b%sXPelsPerMeter = %i\r\n", szV,
pbmihv5->bV5XPelsPerMeter) ;
printf("\t.b%sYPelsPerMeter = %i\r\n", szV,
pbmihv5->bV5YPelsPerMeter) ;
printf("\t.b%sClrUsed = %i\r\n", szV, pbmihv5->bV5ClrUsed) ;
printf("\t.b%sClrImportant = %i\r\n\r\n", szV,
pbmihv5->bV5ClrImportant) ;
printf("\t.b%sRedMask = %08X\r\n", szV,
pbmihv5->bV5RedMask) ;
printf("\t.b%sGreenMask = %08X\r\n", szV,
pbmihv5->bV5GreenMask) ;
printf("\t.b%sBlueMask = %08X\r\n", szV,
pbmihv5->bV5BlueMask) ;
printf("\t.b%sAlphaMask = %08X\r\n", szV,
pbmihv5->bV5AlphaMask) ;
printf("\t.b%sCSType = %u\r\n", szV,
pbmihv5->bV5CSType) ;
printf("\t.b%sEndpoints.ciexyzRed.ciexyzX = %08X\r\n", szV,
pbmihv5->bV5Endpoints.ciexyzRed.ciexyzX) ;
printf("\t.b%sEndpoints.ciexyzRed.ciexyzY = %08X\r\n", szV,
pbmihv5->bV5Endpoints.ciexyzRed.ciexyzY) ;
printf("\t.b%sEndpoints.ciexyzRed.ciexyzZ = %08X\r\n", szV,
pbmihv5->bV5Endpoints.ciexyzRed.ciexyzZ) ;
printf("\t.b%sEndpoints.ciexyzGreen.ciexyzX = %08X\r\n", szV,
pbmihv5->bV5Endpoints.ciexyzGreen.ciexyzX) ;
printf("\t.b%sEndpoints.ciexyzGreen.ciexyzY = %08X\r\n", szV,
pbmihv5->bV5Endpoints.ciexyzGreen.ciexyzY) ;
printf("\t.b%sEndpoints.ciexyzGreen.ciexyzZ = %08X\r\n", szV,
pbmihv5->bV5Endpoints.ciexyzGreen.ciexyzZ) ;
printf("\t.b%sEndpoints.ciexyzBlue.ciexyzX = %08X\r\n", szV,
pbmihv5->bV5Endpoints.ciexyzBlue.ciexyzX) ;
printf("\t.b%sEndpoints.ciexyzBlue.ciexyzY = %08X\r\n", szV,
pbmihv5->bV5Endpoints.ciexyzBlue.ciexyzY) ;
printf("\t.b%sEndpoints.ciexyzBlue.ciexyzZ = %08X\r\n", szV,
pbmihv5->bV5Endpoints.ciexyzBlue.ciexyzZ) ;
printf("\t.b%sGammaRed = %08X\r\n", szV,
pbmihv5->bV5GammaRed) ;
printf("\t.b%sGammaGreen = %08X\r\n", szV,
pbmihv5->bV5GammaGreen) ;
printf("\t.b%sGammaBlue = %08X\r\n\r\n", szV,
pbmihv5->bV5GammaBlue) ;
printf("\t.b%sIntent = %u\r\n", szV, pbmihv5->bV5Intent) ;
printf("\t.b%sProfileData = %u\r\n", szV,
pbmihv5->bV5ProfileData) ;
printf("\t.b%sProfileSize = %u\r\n", szV,
pbmihv5->bV5ProfileSize) ;
printf("\t.b%sReserved = %u\r\n\r\n", szV,
pbmihv5->bV5Reserved) ;
}
free (pFile) ;
}
为了 打印log,需要在对话框初始化部分添加如下代码:
AllocConsole();
SetConsoleTitle(_T("debug console"));
freopen("CONOUT$","w",stdout);
printf("Hello\r\n");
界面如下: