亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: CImgProcessDlg更新記錄--平滑的調(diào)整圖像 [打印本頁]

作者: bibi    時間: 2015-4-18 20:53
標(biāo)題: CImgProcessDlg更新記錄--平滑的調(diào)整圖像
原先在調(diào)整圖像顏色的時候, 如【亮度/對比度】,無法實現(xiàn)實時的預(yù)覽效果,因為有嚴(yán)重的閃爍,今天這個幼稚的BUG被修正了。。Windows中的程序就是不停的畫界面, 每個地方都是一小塊小塊的畫出來的, 畫的不好就會閃爍了...

首先添加兩個指針和一個函數(shù):

KFreeImage* m_pBitmap, *m_pHoldBitmap;                //用來動態(tài)顯示圖片
void QuickUpdateImage(UINT type, bool bRedraw = true, double param1 = 0.0f, double param2 = 0.0f);

為什么添加的是兩個指針而不是變量, 因為這里 KFreeImage 是個封裝FreeImage的圖片對象放在內(nèi)存里面, 已經(jīng)有一個
KFreeImage m_kOrgImage;        存放圖像了, 太多了浪費空間....變量的作用看后面的code....

下面是這個函數(shù)快速的在界面上更新圖片, 給第三方的界面調(diào)用, 可以定義個消息,發(fā)送消息, 也可以直接調(diào)用:
//////////////////////////////////////////////////////////////////////////
//快速臨時的顯示圖片效果
void CImgProcessDlg::QuickUpdateImage(UINT type,
                                                                          bool bRedraw /*= true*/,
                                                                          double param1 /*= 0.0f*/,
                                                                          double param2 /*= 0.0f*/)
{
        if (!m_pHoldBitmap)
                return;

        if (m_pBitmap)
        {
                delete m_pBitmap;
                m_pBitmap = NULL;
        }

        unsigned int W, H;
        W = m_pHoldBitmap->GetWidth();
        H = m_pHoldBitmap->GetHeight();

        m_pBitmap = new KFreeImage;
        m_pBitmap->CopyFrom(*m_pHoldBitmap,0,0,W,H);
       

        switch(type)
        {
        case IDC_BUTTON_ADJUST:
                m_pBitmap->AdjustColors(param1, param2,1.0,FALSE);
                break;
        default:
                break;
        }

        Init(*m_pBitmap);        //Init() 里面的一系列初始化, 就不多說了, 牽扯很多東西

        if(bRedraw)
        {
                RECT r = m_Rect;
                r.right = W < m_Rect.right ? W : m_Rect.right + 16;
                r.bottom = H < m_Rect.bottom ? H : m_Rect.bottom + 16;
                InvalidateRect(&r, FALSE);
        }

}



這里面以【亮度/對比度】為例, 怎么寫代碼:

//////////////////////////////////////////////////////////////////////////

void CImgProcessDlg::OnBnClickedButtonAdjust()
{
        //initialization
        if (m_pHoldBitmap)
        {
                delete m_pHoldBitmap;
                m_pHoldBitmap = NULL;
        }


        m_pHoldBitmap = new KFreeImage;


        //handle zoom first
        if(fabs(m_fZoom-1.0f) < 0.005f)
        {
                m_pHoldBitmap->CopyFrom(m_kOrgImage,0,0,
                        m_kOrgImage.GetWidth(), m_kOrgImage.GetHeight());


        }
        else
        {
                m_kOrgImage.Rescale(*m_pHoldBitmap, (int)(m_fZoom*m_kOrgImage.GetWidth()-0.05f),
                        (int)(m_fZoom*m_kOrgImage.GetHeight()-0.05f), m_eFilterMode);
        }


        CAdjustColors dlg(this);
        INT_PTR ret = dlg.DoModal();        //dlg調(diào)用QuickUpdateImage()調(diào)整圖像


        if (ret != IDOK)
        {
                UpdateImage();  //update to old image
        }
        else //IDOK
        {
                //adjust original image
                m_MenuCommand = IDC_BUTTON_ADJUST;
                para1 = dlg.m_dBrightness;
                para2 = dlg.m_dContrast;

                m_hThreadTools = CreateThread( NULL,
                        0,
                        RunImageToolsThread,
                        this,
                        0,
                        &dwThreadID );
        }


        //clean:
        if (m_pBitmap)
        {
                delete m_pBitmap;
                m_pBitmap = NULL;
        }


        if (m_pHoldBitmap)
        {
                delete m_pHoldBitmap;
                m_pHoldBitmap = NULL;
        }


}



這是調(diào)整圖像就不會閃的亂七八糟了....









歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1