用Visua C++6.0为图像增加彩色滤镜
2008-11-14 19:36:00 来源:WEB开发网下面我们以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(); // 恢复光标
}
- ››Visual Basic 2008 数学函数
- ››Visual Studio2005中Smart Device的问题
- ››Visual Studio 中根据数据库字段动态生成控件
- ››增加VMware虚拟机的磁盘空间
- ››Visual Studio 11全新黑色主题
- ››Visual Studio 2011 Beta新特性(一):安装VS201...
- ››增加网站流量的方法
- ››Visual Studio自定义调试窗体两个小技巧
- ››Visual Studio 2005 Team Edition for Database P...
- ››Visual C#两分钟搭建BHO IE钩子
- ››增加社区模式下板块的显示数量
- ››Visual C++优化对大型数据集合的并发访问
更多精彩
赞助商链接