WORD wbitsCount;//位图中每个像素所占字节数。
       DWORD dwpalettelsize=0;//调色板大小
//以下代码是获取调色板的长度,调色板现在的用处很少,因为256色的位图已经不多了。
       if(wbitsCount<=8)
              dwpalettelsize=(1<<wbitsCount)*sizeof(RGBQUAD);不太明白这个代码
我打算使用单色的位图,那么这里应该如何编写还有下面这个函数,是从DDB转换成DIB的
不过由于没有注释,不太会使用
对于函数的各个形参,我的理解是
HBITMAP   hbm:是将要被转换的位图的句柄
HPALETTE   hpal: 这个应该是使用者创建的调色板的结构的句柄吧
HDC   hdc:这个应该是使用者创建的设备环境的句柄
剩下两个就不太明白了
感觉 WORD   biBits 应该是设置图片是多少色的
DWORD   biStyle 就完全不理解了还有这个函数到底如何用?
是不是传入位图的句柄,自己创建的调色板的句柄,创建的设备环境的句柄,还有剩下两个参数
但是这个函数返回一个句柄,想不通怎么转换成DIB了
望各位大虾指教HANDLE   DibFromBitmap   (HBITMAP   hbm,DWORD   biStyle,WORD   biBits,HPALETTE   hpal,HDC   hdc) 

        BITMAP                               bm; 
        BITMAPINFOHEADER           bi; 
        BITMAPINFOHEADER   FAR   *lpbi; 
        DWORD                                 dwLen; 
        HANDLE                               hdib; 
        HANDLE                               h;         if   (!hbm) 
                return   NULL;         if   (hpal   ==   NULL) 
                hpal   =   (HPALETTE)GetStockObject(DEFAULT_PALETTE);         GetObject(hbm,sizeof(bm),(LPSTR)&bm);         if   (biBits   ==   0) 
                biBits   =     bm.bmPlanes   *   bm.bmBitsPixel;         bi.biSize                               =   sizeof(BITMAPINFOHEADER); 
        bi.biWidth                             =   bm.bmWidth; 
        bi.biHeight                           =   bm.bmHeight; 
        bi.biPlanes                           =   1; 
        bi.biBitCount                       =   biBits; 
        bi.biCompression                 =   biStyle; 
        bi.biSizeImage                     =   0; 
        bi.biXPelsPerMeter             =   0; 
        bi.biYPelsPerMeter             =   0; 
        bi.biClrUsed                         =   0; 
        bi.biClrImportant               =   0;         dwLen     =   bi.biSize   +   PaletteSize(&bi);         hpal   =   SelectPalette(hdc,hpal,FALSE); 
RealizePalette(hdc);         hdib   =   GlobalAlloc(GHND,dwLen);         if   (!hdib){ 
                SelectPalette(hdc,hpal,FALSE); 
                ::ReleaseDC(NULL,hdc); 
                return   NULL; 
        }         lpbi   =   (tagBITMAPINFOHEADER   *)(VOID   FAR   *)GlobalLock(hdib);         *lpbi   =   bi;         GetDIBits(hdc,   hbm,   0L,   (DWORD)bi.biHeight, 
                (LPBYTE)NULL,   (LPBITMAPINFO)lpbi,   (DWORD)DIB_RGB_COLORS);         bi   =   *lpbi; 
        GlobalUnlock(hdib);         if   (bi.biSizeImage   ==   0){ 
                bi.biSizeImage   =   WIDTHBYTES((DWORD)bm.bmWidth   *   biBits)   *   bm.bmHeight;                 if   (biStyle   !=   BI_RGB) 
                        bi.biSizeImage   =   (bi.biSizeImage   *   3)   /   2; 
        }         dwLen   =   bi.biSize   +   PaletteSize(&bi)   +   bi.biSizeImage; 
        if   (h   =   GlobalReAlloc(hdib,dwLen,0)) 
                hdib   =   h; 
        else{ 
                GlobalFree(hdib); 
                hdib   =   NULL;                 SelectPalette(hdc,hpal,FALSE); 
                return   hdib; 
        }         lpbi   =   (tagBITMAPINFOHEADER   *)(VOID   FAR   *)GlobalLock(hdib);         if   (GetDIBits(   hdc, 
hbm, 
0L, 
(DWORD)bi.biHeight, 
(LPBYTE)lpbi   +   (WORD)lpbi-> biSize   +   PaletteSize(lpbi), 
(LPBITMAPINFO)lpbi,   (DWORD)DIB_RGB_COLORS)   ==   0){ 
GlobalUnlock(hdib); 
hdib   =   NULL; 
SelectPalette(hdc,hpal,FALSE); 
return   NULL; 
        } 
        bi   =   *lpbi; 
        GlobalUnlock(hdib); 
        SelectPalette(hdc,hpal,FALSE); 
        return   hdib; 
} BOOL   WriteDIB   (LPSTR   szFile,     HANDLE   hdib) 

BITMAPFILEHEADER         hdr; 
        LPBITMAPINFOHEADER     lpbi; 
        HFILE                               fh; 
        OFSTRUCT                         of;         if   (!hdib) 
                return   FALSE;         fh   =   OpenFile(szFile,   &of,   (UINT)OF_CREATE|OF_READWRITE); 
        if   (fh   ==   -1) 
                return   FALSE;         lpbi   =   (tagBITMAPINFOHEADER   *)(VOID   FAR   *)GlobalLock   (hdib);         hdr.bfType                     =   BFT_BITMAP; 
        hdr.bfSize                     =   GlobalSize   (hdib)   +   SIZEOF_BITMAPFILEHEADER_PACKED; 
        hdr.bfReserved1           =   0; 
        hdr.bfReserved2           =   0; 
        hdr.bfOffBits               =   (DWORD)   (SIZEOF_BITMAPFILEHEADER_PACKED   +   lpbi-> biSize   + 
                                                    PaletteSize(lpbi)); 
#ifdef     FIXDWORDALIGNMENT 
        _lwrite(fh,   (LPSTR)&hdr,   (UINT)(SIZEOF_BITMAPFILEHEADER_PACKED)); 
#else 
                WriteMapFileHeaderandConvertFromDwordAlignToPacked(fh,   &hdr); 
#endif         _lwrite   (fh,   (LPSTR)lpbi,   GlobalSize   (hdib)); 
        GlobalUnlock   (hdib); 
GlobalFree   (hdib); 
        _lclose(fh); 
        return   TRUE; 

解决方案 »

  1.   

    还差一个函数
    void   WriteMapFileHeaderandConvertFromDwordAlignToPacked(HFILE   fh,   LPBITMAPFILEHEADER   pbf) 

            _lwrite(fh,   (LPSTR)&pbf-> bfType,   (UINT)sizeof   (WORD)); 
    _lwrite(fh,   (LPSTR)&pbf-> bfSize,   sizeof(DWORD)   *   3); 
    }
      

  2.   

        WORD wbitsCount;//位图中每个像素所占字节数。感觉注释不太好, wbitsCount看起来应该是颜色深度, 即总颜色数用多少位表示
    256色是8(2的8次方),16色是4, 黑白图是1, 彩色图为32       DWORD dwpalettelsize=0;//调色板大小
    //以下代码是获取调色板的长度,调色板现在的用处很少,因为256色的位图已经不多了。
           if(wbitsCount<=8)
                  dwpalettelsize=(1<<wbitsCount)*sizeof(RGBQUAD);1<<wbitsCount 即2的wbitsCount 次方, 256色为 2的8次方 =256