rt

解决方案 »

  1.   

    Converting DDB to DIB
    http://www.codeguru.com/bitmap/ddb_to_dib.shtml
      

  2.   

    // hBmp是你的DDB句柄
    BITMAP bm;
    ::GetObject(hBmp, sizeof(BITMAP), &bm);
    int nBitCount = 16; // 1, 4, 8, 24, 32 // 保存为几位的图形.
    int nPalCol = 1<<nBitCount;// 1.data buffer
    DWORD dwD = (bm.bmWidth*nBitCount + 31)/32 * 4 * bm.bmHeight;//bm.bmBitsPixel
    BYTE * pData = new BYTE[dwD];// 2.info head buffer.
    DWORD dw;
    if(nBitCount<=8)
     dw = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*nPalCol;
    else
     dw = sizeof(BITMAPINFOHEADER);

    PBITMAPINFO pBmpHead = (PBITMAPINFO)new BYTE[dw];
    pBmpHead->bmiHeader.biSize =sizeof(BITMAPINFOHEADER);
    pBmpHead->bmiHeader.biWidth =bm.bmWidth;
    pBmpHead->bmiHeader.biHeight =bm.bmHeight;
    pBmpHead->bmiHeader.biPlanes =1;
    pBmpHead->bmiHeader.biBitCount =nBitCount;
    pBmpHead->bmiHeader.biCompression =BI_RGB;
    pBmpHead->bmiHeader.biSizeImage =0;
    pBmpHead->bmiHeader.biXPelsPerMeter =0;
    pBmpHead->bmiHeader.biYPelsPerMeter =0;
    pBmpHead->bmiHeader.biClrUsed =0;
    pBmpHead->bmiHeader.biClrImportant =0;

    if(nBitCount<=8)
    ::GetSystemPaletteEntries(hDC, 0, nPalCol, (LPPALETTEENTRY)pBmpHead->bmiColors);

    // 把图形转化为指定格式的DIB格式
    GetDIBits(hDC, hBmp, 0, bm.bmHeight, pData, pBmpHead, DIB_RGB_COLORS);