AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

用Visua C++6.0为图像增加彩色滤镜

51自学网 2015-08-30 http://www.wanshiok.com

  3 编程部分

  下面我们以256级灰度图"angel.bmp"为例,给出用VC++ 6.0编写的主要步骤和关键函数,程序在PC机的Windows 2000 环境中调试通过,并取得了良好的色彩效果。

  (1)建立主界面

  在VC的MFC Appwizard向导下建立一个single document型的工程,其中CFunnyView的基类为CformView,修改菜单属性,如图1的主界面。


        图 1

  单击主界面中"彩色编码"菜单时,执行的函数:

void CFunnyGlassView::OnEnhaColor()
{
// TODO: Add your command handler code here
// 伪彩色编码
// 获取文档
CFunnyGlassDoc* pDoc = GetDocument();
int nColor; // 保存用户选择的伪彩色编码表索引
LPSTR lpDIB; // 指向DIB的指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 锁定DIB
// 判断是否是8-bpp位图(只处理256色位图的伪彩色变换,其它的可以类推)
CDlgColor dlgPara; // 参数对话框
// 初始化变量值
if (pDoc->m_nColorIndex >= 0)
{
// 初始选中当前的伪彩色
dlgPara.m_nColor = pDoc->m_nColorIndex;
}
else
{
// 初始选中灰度伪彩色编码表
dlgPara.m_nColor = 0;
}
// 指向名称数组的指针
dlgPara.m_lpColorName = (LPSTR) ColorScaleName;
// 伪彩色编码数目
dlgPara.m_nColorCount = COLOR_SCALE_COUNT;
// 名称字符串长度
dlgPara.m_nNameLen = sizeof(ColorScaleName) / COLOR_SCALE_COUNT;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
return; // 返回
}
nColor = dlgPara.m_nColor; // 获取用户的设定
delete dlgPara; // 删除对话框
BeginWaitCursor(); // 更改光标形状
// 判断伪彩色编码是否改动
if (pDoc->m_nColorIndex != nColor)
{
// 调用ReplaceColorPal()函数变换调色板
::ReplaceColorPal(lpDIB, (BYTE*) ColorsTable[nColor]);

pDoc->GetDocPalette()->SetPaletteEntries(0, 256, (LPPALETTEENTRY) ColorsTable [nColor]);
// 替换当前文档调色板
pDoc->m_nColorIndex = nColor; // 更新类成员变量
// 设置脏标记 pDoc->SetModifiedFlag(TRUE);
OnDoRealize((WPARAM)m_hWnd,0); // 实现新的调色板
pDoc->UpdateAllViews(NULL); // 更新视图
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());// 解除锁定
EndWaitCursor(); // 恢复光标
}

  (2)建立新对话框

  添加标识为"IDC_Color_List"的对话框,标题为"请选择滤镜颜色:"并在其中添加一个listbox控件和两个命令按钮"OK"和"CANCEL"。


      如图2

  对话框IDC_Color_List中处理的主要函数:

  I、初始化对话框

BOOL CDlgColor::OnInitDialog()
{
CDialog::OnInitDialog();
int i;
// 添加伪彩色编码
for (i = 0; i < m_nColorCount; i++)
{
m_lstColor.AddString(m_lpColorName + i * m_nNameLen);
}
// 选中初始编码表
m_lstColor.SetCurSel(m_nColor);
return TRUE; // // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

  II、当用户确定所选码表时,执行以下函数:

void CDlgColor::OnOK()
{
// TODO: Add extra validation here
// 用户单击确定按钮
m_nColor = m_lstColor.GetCurSel();
CDialog::OnOK();
}

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:浅谈HOOK技术在VC编程中的应用  下一篇:用VC++实现版本在线升级