GDI在内存中绘图并保存图片

void DrawImageEx(HDC hdc, Image* pImage, RECT rc)
{
    if (pImage)
    {
        Graphics g(hdc);
        ImageAttributes ImgAtt;
        ImgAtt.SetWrapMode(WrapModeTileFlipXY);
        g.DrawImage(pImage,  Rect(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top),
            0, 0, pImage->GetWidth(), pImage->GetHeight(),
            UnitPixel, &ImgAtt, NULL, NULL);
    }
    else
    {
        //绘制背景
        HBRUSH hbrush = CreateSolidBrush(GetBkColor(hdc));
        ::FillRect(hdc, &rc, hbrush);
        ::DeleteObject(hbrush);
    }
}
 

void CMgr_PictureSave::DrawLine(HDC hdc, tagDrawData* pData, bool bDrawMove, bool isSelect, bool bSave)
{
    COLORREF clr = 0xFF0000;
    HPEN hPen;
    if (isSelect)
    {
        hPen = ::CreatePen(PS_SOLID, 4, RGB(GetBValue(clr), GetGValue(clr), GetRValue(clr)));
    } 
    else
    {
        hPen = ::CreatePen(PS_SOLID, 2, RGB(GetBValue(clr), GetGValue(clr), GetRValue(clr)));
    }
    HPEN hPenOld =  (HPEN)::SelectObject(hdc, hPen);

    for(int i =0; i< pData->nPtNum; i++)
    {
        if (i >= MAXDRAWPOINTS) break;

        if (i == 0)
        {
            ::MoveToEx(hdc, pData->x[i], pData->y[i], NULL);
        }
        else 
        {
            ::LineTo(hdc, pData->x[i], pData->y[i]);
        }
    }
    ::SelectObject(hdc, hPenOld);
    DeleteObject(hPen);
}

void CMgr_PictureSave::DrawGraph(HDC hdc, bool bSave)
{
    CCriticalLock lock(_pcs);
    // 绘制时数据转换,避免存储反复转换的误差
    tagDrawData tData;
    bool isSelect = false;
    tagDrawData pTagData;
    map<u32, tagDrawData*>::iterator ite;
    ite = m_mapDrawData.begin();
    while(ite != m_mapDrawData.end())
    {

        if (ite->second != NULL && ite->second->isHide == false)
        {    
            if (ite->second->nType == m_nCurSelType)
            {
                isSelect = TRUE;
                memcpy(&tData, ite->second, sizeof(tagDrawData));
            }
            else
            {
                DrawLine(hdc, ite->second, false, false, bSave);
               // DrawTxtId(hdc, ite->second);
            }
        }
        ite++;
    }

    if (isSelect)
    {
        DrawLine(hdc, &tData, false, false, bSave);
       // DrawTxtId(hdc, &tData);
        //DrawSpecific(hdc, &tData, false, bSave);
    }

}
 

void CMgr_PictureSave::SavePic(HWND hwnd, CStdString sPath)
{
    HDC hdc = GetDC(hwnd);//hwnd 可以为NULL
    HDC hTempMemDC = ::CreateCompatibleDC(NULL);
    HBITMAP bmpTmpDraw = ::CreateCompatibleBitmap(hdc, m_nWCoeffOuter, m_nHCoeffOuter);//hdc
    if(bmpTmpDraw  == NULL) bmpTmpDraw = ::CreateCompatibleBitmap(hdc, m_nWCoeffOuter, m_nHCoeffOuter);
    if (bmpTmpDraw  == NULL)
    {
        return;
    }
    HGDIOBJ oldObj = ::SelectObject(hTempMemDC, bmpTmpDraw);
    RECT rc;
    rc.left = 0;
    rc.top = 0;
    rc.right = m_nWCoeffOuter;
    rc.bottom = m_nHCoeffOuter;
    DrawImageEx(hTempMemDC, m_pImagePic, rc);
    DrawGraph(hTempMemDC, true);
    
    SYSTEMTIME st;
    GetLocalTime(&st);
    u32 dwAddr = pMgrData->GetIP();
    u8 *pch = (u8 *)&dwAddr;
    wchar_t szIPAddr[64] = {0};
    wsprintf(szIPAddr, TEXT("%d.%d.%d.%d"), *pch, *(pch+1), *(pch +2), *(pch+3));
    wchar_t cDate[20] = {0};
    wsprintf(cDate, TEXT("%d-%d-%d"), st.wYear, st.wMonth, st.wDay);

    wchar_t fileName[100] = {0};
    wsprintf(fileName, TEXT("%s_%s_场景%d.jpg"), szIPAddr, cDate, m_nScenceIndex+1);
    CStdString sNewPath;
    sNewPath.Append(sPath.GetData());
    sNewPath.Append(TEXT("\\"));
    sNewPath.Append(fileName);
    
    Bitmap bm((HBITMAP)bmpTmpDraw, NULL);
    CLSID Clsid;
    GetEncoderClsid(L"image/jpeg", &Clsid);//GetEncoderClsid函数在文末
    bm.Save(sNewPath, &Clsid);

    SelectObject(hTempMemDC, oldObj);
    
    if(bmpTmpDraw != NULL)
    {
        DeleteObject(bmpTmpDraw); 
        bmpTmpDraw = NULL;
    }
    if(hTempMemDC != NULL)
    {
        DeleteObject(hTempMemDC); 
        hTempMemDC = NULL;
    }

}

//---------------

CLSID encoderClsid 可支持的样式:

GetEncoderClsid(L"image/png", &Clsid);   
 
     GetEncoderClsid(L"image/bmp", &Clsid);
 
     GetEncoderClsid(L"image/gif", &Clsid);
 
     GetEncoderClsid(L"image/jpeg", &Clsid);
 
     GetEncoderClsid(L"image/tiff", &Clsid);

猜你喜欢

转载自blog.csdn.net/qq_16628589/article/details/88566006
今日推荐