• 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;

    }

  • 相关阅读:
    面试代码基础(一)从strstr说起
    面试笔试总结(二)之 C++基础
    面试笔试总结(一)之 C++基础
    HMM代码实践
    计算两篇文章相似度代码
    主题模型
    mysql5.6.34-debug Source distribution在树莓派下编译的几个错误
    windows守护进程脚本
    fastcgi模式下设置php最大执行时间
    mysql基础知识笔记
  • 原文地址:https://www.cnblogs.com/wqj1212/p/1047159.html
Copyright © 2020-2023  润新知