可以这样实现:
1、由hDC获取内存位图
2、针对内存位图进行转换运算
3、保存为16色的位图文件格式大部分代码可能都要写。

解决方案 »

  1.   

    我这有一个hBitmap(DDB)转
    BITMAPFILEHEADER *(DIB)的函数;
    BitCount取值为1,4,8,16,24,32;
    BITMAPFILEHEADER * DDBToDIB (HDC hdc, HBITMAP hBitmap,int BitCount)
    {
    BITMAP bm;
    int    iOffset, iSizeImage ;
    BYTE   *pBits;
    BITMAPFILEHEADER *pbfh;
    BITMAPINFO *pbi;
    if(NULL==hBitmap)
    return NULL;
    GetObject(hBitmap,sizeof(BITMAP),&bm);
    switch(BitCount)
    {
    case 1:
    case 4:
    case 8:
    iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<BitCount);
    break;
    case 16:
    case 24:
    case 32:
    iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
    break;
    default:
    return NULL;
    }
    iSizeImage=(((bm.bmWidth*BitCount+31)/32)*4)*bm.bmHeight;
    pbfh=(BITMAPFILEHEADER *)malloc(iOffset+iSizeImage);
    if(NULL==pbfh)
    return NULL;
    pBits=(BYTE *)pbfh+iOffset;
    pbi=(BITMAPINFO *)(pbfh+1);
    pbfh->bfType=0x4D42;
    pbfh->bfSize=iOffset+iSizeImage;
    pbfh->bfReserved1=0;
    pbfh->bfReserved2=0;
    pbfh->bfOffBits=iOffset; pbi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    pbi->bmiHeader.biWidth=bm.bmWidth;
    pbi->bmiHeader.biHeight=bm.bmHeight;
    pbi->bmiHeader.biPlanes=1;
    pbi->bmiHeader.biBitCount=BitCount;
    pbi->bmiHeader.biCompression=BI_RGB;
    pbi->bmiHeader.biSizeImage=iSizeImage;
    pbi->bmiHeader.biXPelsPerMeter=0;
    pbi->bmiHeader.biYPelsPerMeter=0;
    if(BitCount<16)
    {
    pbi->bmiHeader.biClrUsed=pbi->bmiHeader.biClrImportant=(1<<BitCount);
    }
    else
    {
    pbi->bmiHeader.biClrUsed=pbi->bmiHeader.biClrImportant=0;
    }
    GetDIBits(hdc,hBitmap,0,bm.bmHeight,pBits,pbi,DIB_RGB_COLORS);
    return pbfh;
    }
      

  2.   

    4楼那函数我是用来保存截屏下来的HBITMAP图到文件用的.