找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3510|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

CImgProcessDlg更新記錄--平滑的調(diào)整圖像

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:77367 發(fā)表于 2015-4-18 20:53 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
原先在調(diào)整圖像顏色的時(shí)候, 如【亮度/對(duì)比度】,無(wú)法實(shí)現(xiàn)實(shí)時(shí)的預(yù)覽效果,因?yàn)橛袊?yán)重的閃爍,今天這個(gè)幼稚的BUG被修正了。。Windows中的程序就是不停的畫(huà)界面, 每個(gè)地方都是一小塊小塊的畫(huà)出來(lái)的, 畫(huà)的不好就會(huì)閃爍了...

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

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

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

下面是這個(gè)函數(shù)快速的在界面上更新圖片, 給第三方的界面調(diào)用, 可以定義個(gè)消息,發(fā)送消息, 也可以直接調(diào)用:
//////////////////////////////////////////////////////////////////////////
//快速臨時(shí)的顯示圖片效果
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() 里面的一系列初始化, 就不多說(shuō)了, 牽扯很多東西

        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);
        }

}



這里面以【亮度/對(duì)比度】為例, 怎么寫(xiě)代碼:

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

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)整圖像就不會(huì)閃的亂七八糟了....




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表