📄 linjunjuandoc.cpp
字号:
// 创建对话框
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);
int bmpWidth=WIDTHBYTES(::DIBWidth(lpDIB) * 8);
// 调用ErosionDIB()函数腐蚀DIB
if (ErosionDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nMode , structure))
{
// 设置脏标记
for (int i=dealpic.row-1;i>=0;i--)
for (int j=0;j<dealpic.col;j++)
{
dealpic.p[dealpic.row-i-1][j]=*(lpDIBBits+i*bmpWidth+j);
}
// 更新视图
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(dealpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
}
else
{
// 提示用户
AfxMessageBox("分配内存失败或者图像中含有0和255之外的像素值!",/* "系统提示" , */MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) ChangeToHDIB(orgpic));
// 恢复光标
EndWaitCursor();
}
void CLinjunjuanDoc::OnMorphDilation()
{
//腐蚀运算
// 获取文档
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) ChangeToHDIB(orgpic));
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的腐蚀,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
AfxMessageBox("目前只支持256色位图的腐蚀!", /*"系统提示" ,*/ MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL)ChangeToHDIB(orgpic));
// 返回
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);
int bmpWidth=WIDTHBYTES(::DIBWidth(lpDIB) * 8);
// 调用ErosionDIB()函数腐蚀DIB
if (DilationDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nMode , structure))
{
// 设置脏标记
for (int i=dealpic.row-1;i>=0;i--)
for (int j=0;j<dealpic.col;j++)
{
dealpic.p[dealpic.row-i-1][j]=*(lpDIBBits+i*bmpWidth+j);
}
// 更新视图
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(dealpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
}
else
{
// 提示用户
AfxMessageBox("分配内存失败或者图像中含有0和255之外的像素值!",/* "系统提示" , */MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) ChangeToHDIB(orgpic));
// 恢复光标
EndWaitCursor();
}
void CLinjunjuanDoc::OnMorphOpen()
{
//腐蚀运算
// 获取文档
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) ChangeToHDIB(orgpic));
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的腐蚀,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
AfxMessageBox("目前只支持256色位图的腐蚀!", /*"系统提示" ,*/ MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL)ChangeToHDIB(orgpic));
// 返回
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);
int bmpWidth=WIDTHBYTES(::DIBWidth(lpDIB) * 8);
// 调用ErosionDIB()函数腐蚀DIB
if (OpenDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), nMode , structure))
{
// 设置脏标记
for (int i=dealpic.row-1;i>=0;i--)
for (int j=0;j<dealpic.col;j++)
{
dealpic.p[dealpic.row-i-1][j]=*(lpDIBBits+i*bmpWidth+j);
}
// 更新视图
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(dealpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
}
else
{
// 提示用户
AfxMessageBox("分配内存失败或者图像中含有0和255之外的像素值!",/* "系统提示" , */MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) ChangeToHDIB(orgpic));
// 恢复光标
EndWaitCursor();
}
void CLinjunjuanDoc::OnMorphClose()
{
//腐蚀运算
// 获取文档
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) ChangeToHDIB(orgpic));
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的腐蚀,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
AfxMessageBox("目前只支持256色位图的腐蚀!", /*"系统提示" ,*/ MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL)ChangeToHDIB(orgpic));
// 返回
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);
int bmpWidth=WIDTHBYTES(::DIBWidth(lpDIB) * 8);
// 调用ErosionDIB()函数腐蚀DIB
if (CloseDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nMode , structure))
{
// 设置脏标记
for (int i=dealpic.row-1;i>=0;i--)
for (int j=0;j<dealpic.col;j++)
{
dealpic.p[dealpic.row-i-1][j]=*(lpDIBBits+i*bmpWidth+j);
}
// 更新视图
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(dealpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
}
else
{
// 提示用户
AfxMessageBox("分配内存失败或者图像中含有0和255之外的像素值!",/* "系统提示" , */MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) ChangeToHDIB(orgpic));
// 恢复光标
EndWaitCursor();
}
void CLinjunjuanDoc::OnMorphThining()
{
//腐蚀运算
// 获取文档
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) ChangeToHDIB(orgpic));
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的腐蚀,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
AfxMessageBox("目前只支持256色位图的腐蚀!", /*"系统提示" ,*/ MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL)ChangeToHDIB(orgpic));
// 返回
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);
int bmpWidth=WIDTHBYTES(::DIBWidth(lpDIB) * 8);
// 调用ErosionDIB()函数腐蚀DIB
if (ThiningDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB)))
{
// 设置脏标记
for (int i=dealpic.row-1;i>=0;i--)
for (int j=0;j<dealpic.col;j++)
{
dealpic.p[dealpic.row-i-1][j]=*(lpDIBBits+i*bmpWidth+j);
}
// 更新视图
dspace_2d(orgpic.p,orgpic.row,orgpic.col);
orgpic=dealpic;
if ((m_hDIB=ChangeToHDIB(dealpic))==NULL)
{
AfxMessageBox("不能显示!");
return ;
}
SaveHistory();
InitDIBData();
UpdateAllViews(NULL);
}
else
{
// 提示用户
AfxMessageBox("分配内存失败或者图像中含有0和255之外的像素值!",/* "系统提示" , */MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) ChangeToHDIB(orgpic));
// 恢复光标
EndWaitCursor();
}
void CLinjunjuanDoc::OnEdgeContour()
{
//腐蚀运算
// 获取文档
if (!flagpic)
{
AfxMessageBox("没有输入图象!");
return;
}
dealpic.row=orgpic.row;
dealpic.col=orgpic.col;
if (!(dealpic.p=fspace_2d(dealpic.row,dealpic.col)))
{
AfxMessageBox("分配空间错误!");
return;
}
// 指向DIB的指针
LPSTR lpDIB;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -