DDB to DIB


bool CCStaticDrawDlg::SaveBitmapFile(CString strFileName, CBitmap &bmp,CDC *pdc)
{
    BITMAP bm;
    bmp.GetBitmap (
&bm);
    
    
int nWidth = bm.bmWidth;
    
int nHeight = bm.bmHeight;
    
    
int nLineBits = bm.bmWidthBytes;
    
if ((nLineBits % 8!= 0)
        nLineBits 
+= 8 - nLineBits%8;

    
int nBitCounts = nLineBits * bm.bmHeight ;

    
int nBits = 24;//bm.bmBitsPixel;
    int nBitmapInfoSize = 0;

    
if (nBits <= 8)
    
{
        
int nColors = 1 << nBits;
        
int nPalUnitSize = sizeof(RGBQUAD);
        nBitmapInfoSize 
= sizeof(BITMAPINFOHEADER) + nPalUnitSize * nColors;    
    }

    
else
        nBitmapInfoSize 
= sizeof(BITMAPINFOHEADER);

    BITMAPINFO
*    pbmpinfo = NULL;

    pbmpinfo 
=(BITMAPINFO *)(new BYTE[nBitmapInfoSize]);
    ZeroMemory((
void *)pbmpinfo,nBitmapInfoSize);
    
    BITMAPINFOHEADER
* pInfoHead = (BITMAPINFOHEADER *)pbmpinfo;
    ZeroMemory((
void *)pInfoHead,sizeof(BITMAPINFOHEADER));

    pInfoHead
->biSize = sizeof(BITMAPINFOHEADER);
    pInfoHead
->biBitCount = nBits;
    pInfoHead
->biPlanes = 1;
    pInfoHead
->biSizeImage = nBitCounts;
    pInfoHead
->biCompression = BI_RGB;
    pInfoHead
->biWidth = nWidth;
    pInfoHead
->biHeight = nHeight;

    
        CDC dc;
        dc.CreateDC(
"DISPLAY",NULL,NULL,NULL);
    
        
int nLx = dc.GetDeviceCaps (LOGPIXELSX);
        
int nLy = dc.GetDeviceCaps (LOGPIXELSY);
    
        
double dbInchPerMeter = 39.375;
    
        
int nPMx = (int)((double)nLx * dbInchPerMeter);
        
int nPMy = (int)((double)nLy * dbInchPerMeter);
    
        pInfoHead
->biXPelsPerMeter = nPMx;//3780;
        pInfoHead->biYPelsPerMeter = nPMy;//3780;
        
        
if (nBits <= 8)
        
{
            
int nColors = 1 << nBits;
            GetDIBColorTable(dc.m_hDC,
0,nColors,pbmpinfo->bmiColors);
        }

    
        BYTE
* pBits = NULL;
        
    
//    HGLOBAL hGlobal = ::GlobalAlloc(GMEM_FIXED, nBitCounts);
    
//    pBits = (BYTE *)::GlobalLock(hGlobal);
        pBits=new byte[nBitCounts];
        ZeroMemory((
void *)pBits,nBitCounts);
    
    
    GetDIBits(pdc
->m_hDC,(HBITMAP)bmp,0,nHeight,pBits,pbmpinfo,DIB_RGB_COLORS);

    BITMAPFILEHEADER    bmfHeader;
    
int nFileHeadSize = sizeof(BITMAPFILEHEADER);
    
    ZeroMemory((
void *)&bmfHeader,sizeof(BITMAPFILEHEADER));
    bmfHeader.bfType 
= 19778;//'BM'    ((WORD) ('M' << 8) | 'B'); 
    bmfHeader.bfSize = nFileHeadSize + nBitmapInfoSize + nBitCounts;
    bmfHeader.bfOffBits 
= sizeof(BITMAPFILEHEADER) + nBitmapInfoSize;

    CFile file;
    
    
if(!file.Open (strFileName,CFile::modeCreate | CFile::modeWrite))
    
{
        AfxMessageBox(
"Write File Error!");
        
return FALSE;
    }


    file.Write (
&bmfHeader,sizeof(BITMAPFILEHEADER));
    file.Write (pbmpinfo,nBitmapInfoSize);

    file.WriteHuge(pBits, nBitCounts);
    file.Close ();
    
    delete pBits;
//    ::GlobalUnlock (hGlobal);
//    ::GlobalFree (hGlobal);
    delete[] pbmpinfo;

    
return TRUE;

}

posted on 2008-01-21 13:52  wqj1212  阅读(495)  评论(0编辑  收藏  举报

导航