现在要做一个位图的腐蚀程序
我已经找到了《Visual C++ 数字图像处理》的源程序了,但是还是搞不定
我只做其中的腐蚀部分,但源程序太大太多功能而且是基于多文档的,我要完成的是基于对话框的,也就是用一个按钮实现腐蚀而不是像源程序里面利用菜单选择腐蚀界面然后生成一个对话框点击确定实现腐蚀
腐蚀的源程序也有了
void CCh1_1View::OnMorphErosion() 
{
//腐蚀运算
// 获取文档
CCh1_1Doc* pDoc = GetDocument();

// 指向DIB的指针
LPSTR lpDIB; // 指向DIB象素指针
LPSTR   lpDIBBits;

// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());

// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的腐蚀,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的腐蚀!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
int nMode;
// 创建对话框
cDlgMorphErosion dlgPara;
// 初始化变量值
dlgPara.m_nMode = 0;

// 显示对话框,提示用户设定腐蚀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的腐蚀方向
nMode = dlgPara.m_nMode;
int structure[3][3];
if (nMode == 2)
{
structure[0][0]=dlgPara.m_nStructure1;
structure[0][1]=dlgPara.m_nStructure2;
structure[0][2]=dlgPara.m_nStructure3;
structure[1][0]=dlgPara.m_nStructure4;
structure[1][1]=dlgPara.m_nStructure5;
structure[1][2]=dlgPara.m_nStructure6;
structure[2][0]=dlgPara.m_nStructure7;
structure[2][1]=dlgPara.m_nStructure8;
structure[2][2]=dlgPara.m_nStructure9;
}

// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 调用ErosionDIB()函数腐蚀DIB
if (ErosionDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nMode , structure))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败或者图像中含有0和255之外的像素值!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
而我只要弄到一个按钮里面去,也就是
void CBmpErosionDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
}
该怎么弄啊,头大了。。

解决方案 »

  1.   

    由lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB())可知,原先对DIB操作的类都放到CDocument类中了,假如你要实现基于对话框的,那么首先要把这些操作DIB类加入到你基于对话框建立的工程中,然后将上述的程序考到你的OnButton2()函数中,当然里面通过pDoc->操作的函数和变量你要设定正确了,而源程序中是生成对话框后再提示用户选择腐蚀方向等等,这个就说明腐蚀类是被生成的对话框类所拥有,那么你就可以将这些类直接拿来放到你自己的OnButton2()函数里面就行了,当然必须把这个腐蚀类正确加入到你的工程中来,头文件包含什么的的也要搞正确了才行。
      

  2.   

    你完全弄错了,你复制上来的只是一些文档的东西,真正核心的代码在ErosionDIB这个函数里,其实腐蚀的原理很简单,你库创建一个动态的数组,全置为255,然后扫描图像,置当前点为0,如果当前点和前一个点以及后一个点中有一个点是255则将当前点置255,这是水平方向的腐蚀,垂直的类推。