我取得 HBITMAP 如下;
HBITMAP hbm=(HBITMAP)LoadImage(NULL,"c:\\8.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);如何通过HBITMAP得到BMP图的BITMAPINFOHEADER 信息

解决方案 »

  1.   

    http://topic.csdn.net/t/20040725/15/3208142.html
      

  2.   

    遇到问题多查查MSDNPBITMAPINFO CreateBitmapInfoStruct(HWND hwnd, HBITMAP hBmp)

        BITMAP bmp; 
        PBITMAPINFO pbmi; 
        WORD    cClrBits;     // Retrieve the bitmap's color format, width, and height. 
        if (!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp)) 
            errhandler("GetObject", hwnd);     // Convert the color format to a count of bits. 
        cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel); 
        if (cClrBits == 1) 
            cClrBits = 1; 
        else if (cClrBits <= 4) 
            cClrBits = 4; 
        else if (cClrBits <= 8) 
            cClrBits = 8; 
        else if (cClrBits <= 16) 
            cClrBits = 16; 
        else if (cClrBits <= 24) 
            cClrBits = 24; 
        else cClrBits = 32;     // Allocate memory for the BITMAPINFO structure. (This structure 
        // contains a BITMAPINFOHEADER structure and an array of RGBQUAD 
        // data structures.)      if (cClrBits != 24) 
             pbmi = (PBITMAPINFO) LocalAlloc(LPTR, 
                        sizeof(BITMAPINFOHEADER) + 
                        sizeof(RGBQUAD) * (1<< cClrBits));      // There is no RGBQUAD array for the 24-bit-per-pixel format.      else 
             pbmi = (PBITMAPINFO) LocalAlloc(LPTR, 
                        sizeof(BITMAPINFOHEADER));     // Initialize the fields in the BITMAPINFO structure.     pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
        pbmi->bmiHeader.biWidth = bmp.bmWidth; 
        pbmi->bmiHeader.biHeight = bmp.bmHeight; 
        pbmi->bmiHeader.biPlanes = bmp.bmPlanes; 
        pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel; 
        if (cClrBits < 24) 
            pbmi->bmiHeader.biClrUsed = (1<<cClrBits);     // If the bitmap is not compressed, set the BI_RGB flag. 
        pbmi->bmiHeader.biCompression = BI_RGB;     // Compute the number of bytes in the array of color 
        // indices and store the result in biSizeImage. 
        // For Windows NT/2000, the width must be DWORD aligned unless 
        // the bitmap is RLE compressed. This example shows this. 
        // For Windows 95/98, the width must be WORD aligned unless the 
        // bitmap is RLE compressed.
        pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8
                                      * pbmi->bmiHeader.biHeight; 
        // Set biClrImportant to 0, indicating that all of the 
        // device colors are important. 
         pbmi->bmiHeader.biClrImportant = 0; 
         return pbmi; 
     } 
    The following example code defines a function that initializes the remaining structures, retrieves the array of palette indices, opens the file, copies the data, and closes the file. void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi, 
                      HBITMAP hBMP, HDC hDC) 
     { 
         HANDLE hf;                 // file handle 
        BITMAPFILEHEADER hdr;       // bitmap file-header 
        PBITMAPINFOHEADER pbih;     // bitmap info-header 
        LPBYTE lpBits;              // memory pointer 
        DWORD dwTotal;              // total count of bytes 
        DWORD cb;                   // incremental count of bytes 
        BYTE *hp;                   // byte pointer 
        DWORD dwTmp;     pbih = (PBITMAPINFOHEADER) pbi; 
        lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);    if (!lpBits) 
             errhandler("GlobalAlloc", hwnd);     // Retrieve the color table (RGBQUAD array) and the bits 
        // (array of palette indices) from the DIB. 
        if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi, 
            DIB_RGB_COLORS)) 
        {
            errhandler("GetDIBits", hwnd); 
        }    // Create the .BMP file. 
        hf = CreateFile(pszFile, 
                       GENERIC_READ | GENERIC_WRITE, 
                       (DWORD) 0, 
                        NULL, 
                       CREATE_ALWAYS, 
                       FILE_ATTRIBUTE_NORMAL, 
                       (HANDLE) NULL); 
        if (hf == INVALID_HANDLE_VALUE) 
            errhandler("CreateFile", hwnd); 
        hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M" 
        // Compute the size of the entire file. 
        hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + 
                     pbih->biSize + pbih->biClrUsed 
                     * sizeof(RGBQUAD) + pbih->biSizeImage); 
        hdr.bfReserved1 = 0; 
        hdr.bfReserved2 = 0;     // Compute the offset to the array of color indices. 
        hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + 
                        pbih->biSize + pbih->biClrUsed 
                        * sizeof (RGBQUAD);     // Copy the BITMAPFILEHEADER into the .BMP file. 
        if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), 
            (LPDWORD) &dwTmp,  NULL)) 
        {
           errhandler("WriteFile", hwnd); 
        }    // Copy the BITMAPINFOHEADER and RGBQUAD array into the file. 
        if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER) 
                      + pbih->biClrUsed * sizeof (RGBQUAD), 
                      (LPDWORD) &dwTmp, ( NULL)) 
            errhandler("WriteFile", hwnd);     // Copy the array of color indices into the .BMP file. 
        dwTotal = cb = pbih->biSizeImage; 
        hp = lpBits; 
        if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL)) 
               errhandler("WriteFile", hwnd);     // Close the .BMP file. 
         if (!CloseHandle(hf)) 
               errhandler("CloseHandle", hwnd);     // Free memory. 
        GlobalFree((HGLOBAL)lpBits);
    }
      

  3.   

    DLLEX int LHxxLOAD_256BMP(LHxxBITMAPFILE *bitmap,char *filename)
    {
    // this function opens a bitmap file and loads the data into bitmapint file_handle,  // the file handle
        index;        // looping indexUCHAR   *temp_buffer = NULL; // used to convert 24 bit images to 16 bit
    OFSTRUCT file_data;          // the file data information// open the file if it exists
    if ((file_handle = OpenFile(filename,&file_data,OF_READ))==-1)
       return(0);// now load the bitmap file header
    _lread(file_handle, &bitmap->LHxxBitmapFileHeader,sizeof(BITMAPFILEHEADER));// test if this is a bitmap file
    if (bitmap->LHxxBitmapFileHeader.bfType!=LHxxBITMAP_ID)
    {
       // close the file
       _lclose(file_handle);   // return error
      // return(0);
       } // end if// now load the bitmap file header
    _lread(file_handle, &bitmap->LHxxBitmapInfoHeader,sizeof(BITMAPINFOHEADER));// now load the color palette if there is one
    if (bitmap->LHxxBitmapInfoHeader.biBitCount == 8)
       {
       _lread(file_handle, &bitmap->LHxxPalette,LHxxMAX_COLORS_PALETTE*sizeof(PALETTEENTRY));   // now set all the flags in the palette correctly and fix the reversed 
       // BGR RGBQUAD data format
       for (index=0; index < LHxxMAX_COLORS_PALETTE; index++)
           {
           // reverse the red and green fields
           int temp_color                = bitmap->LHxxPalette[index].peRed;
           bitmap->LHxxPalette[index].peRed  = bitmap->LHxxPalette[index].peBlue;
           bitmap->LHxxPalette[index].peBlue = temp_color;
           
           // always set the flags word to this
           bitmap->LHxxPalette[index].peFlags = PC_NOCOLLAPSE;
           } // end for index    } // end if// finally the image data itself
    _lseek(file_handle,-(int)(bitmap->LHxxBitmapInfoHeader.biSizeImage),SEEK_END);// now read in the imageif (bitmap->LHxxBitmapInfoHeader.biBitCount==8 || bitmap->LHxxBitmapInfoHeader.biBitCount==16 || 
        bitmap->LHxxBitmapInfoHeader.biBitCount==24)
       {
       // delete the last image if there was one
       if (bitmap->LHxxBuffer)
           free(bitmap->LHxxBuffer);   // allocate the memory for the image
       if (!(bitmap->LHxxBuffer = (UCHAR *)malloc(bitmap->LHxxBitmapInfoHeader.biSizeImage)))
          {
          // close the file
          _lclose(file_handle);      // return error
          return(0);
          } // end if   // now read it in
       _lread(file_handle,bitmap->LHxxBuffer,bitmap->LHxxBitmapInfoHeader.biSizeImage);   } // end if
    else
       {
       // serious problem
       return(0);   } // end else#if 0
    // write the file info out 
    printf("\nfilename:%s \nsize=%d \nwidth=%d \nheight=%d \nbitsperpixel=%d \ncolors=%d \nimpcolors=%d",
            filename,
            bitmap->LHxxBitmapInfoHeader.biSizeImage,
            bitmap->LHxxBitmapInfoHeader.biWidth,
            bitmap->LHxxBitmapInfoHeader.biHeight,
    bitmap->LHxxBitmapInfoHeader.biBitCount,
            bitmap->LHxxBitmapInfoHeader.biClrUsed,
            bitmap->LHxxBitmapInfoHeader.biClrImportant);
    #endif// close the file
    _lclose(file_handle);// flip the bitmap
    Flip_Bitmap(bitmap->LHxxBuffer, 
                bitmap->LHxxBitmapInfoHeader.biWidth*(bitmap->LHxxBitmapInfoHeader.biBitCount/8), 
                bitmap->LHxxBitmapInfoHeader.biHeight);/*FILE *fp2;
    fp2=fopen(filename2,"wb");
    for (int index_y=0; index_y<bitmap->bitmapinfoheader.biHeight; index_y++)
        {
    fwrite(bitmap->buffer,bitmap->bitmapinfoheader.biWidth,1,fp2);
        bitmap->buffer += bitmap->bitmapinfoheader.biWidth;
        } 
    fclose(fp2);*/
    // return successLHxxSET_PALETTE( bitmap->LHxxPalette );
    //MessageBox(DrawHwnd, "okok", "FREE_OK", MB_OK);
    return(1);
    } // end Load_Bitmap_File