zoukankan      html  css  js  c++  java
  • 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;

    }

  • 相关阅读:
    Java程序员的成神之路
    es集群搭建(2个节点)
    MySQL主从复制与主主复制
    高并发量服务器架构
    AngularJS跨域问题
    CentOs7.3 搭建 RabbitMQ 3.6 单机服务与使用
    Dubbo的高可用
    Nginx配置性能优化
    从Socket谈到浏览器和服务器之间的关系
    关于数据库死锁
  • 原文地址:https://www.cnblogs.com/wqj1212/p/1047159.html
Copyright © 2011-2022 走看看