win32 显示 BMP 文件的 文件头信息

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");

界面如下:
这里写图片描述

工程代码如下:
https://download.csdn.net/download/wowocpp/10510822

猜你喜欢

转载自blog.csdn.net/wowocpp/article/details/80870248