找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2948|回复: 0
打印 上一主题 下一主题
收起左侧

CImgProcessDlg更新记录--平滑的调整图像

[复制链接]
跳转到指定楼层
楼主
ID:77367 发表于 2015-4-18 20:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原先在调整图像颜色的时候, 如【亮度/对比度】,无法实现实时的预览效果,因为有严重的闪烁,今天这个幼稚的BUG被修正了。。Windows中的程序就是不停的画界面, 每个地方都是一小块小块的画出来的, 画的不好就会闪烁了...

首先添加两个指针和一个函数:

KFreeImage* m_pBitmap, *m_pHoldBitmap;                //用来动态显示图片
void QuickUpdateImage(UINT type, bool bRedraw = true, double param1 = 0.0f, double param2 = 0.0f);

为什么添加的是两个指针而不是变量, 因为这里 KFreeImage 是个封装FreeImage的图片对象放在内存里面, 已经有一个
KFreeImage m_kOrgImage;        存放图像了, 太多了浪费空间....变量的作用看后面的code....

下面是这个函数快速的在界面上更新图片, 给第三方的界面调用, 可以定义个消息,发送消息, 也可以直接调用:
//////////////////////////////////////////////////////////////////////////
//快速临时的显示图片效果
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调用QuickUpdateImage()调整图像


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


}



这是调整图像就不会闪的乱七八糟了....




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表