📄 ch1_1view.cpp
字号:
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CCh1_1View::OnGeomZoom()
{
// 图像缩放
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 锁定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;
}
// 缩放比率
float fXZoomRatio;
float fYZoomRatio;
// 创建对话框
CDlgGeoZoom dlgPara;
// 初始化变量值
dlgPara.m_XZoom = 0.5;
dlgPara.m_YZoom = 0.5;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
fXZoomRatio = dlgPara.m_XZoom;
fYZoomRatio = dlgPara.m_YZoom;
// 删除对话框
delete dlgPara;
// 创建新DIB
HDIB hNewDIB = NULL;
// 更改光标形状
BeginWaitCursor();
// 调用ZoomDIB()函数转置DIB
hNewDIB = (HDIB) ZoomDIB(lpDIB, fXZoomRatio, fYZoomRatio);
// 判断缩放是否成功
if (hNewDIB != NULL)
{
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CCh1_1View::OnGeomRota()
{
// 图像旋转
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 锁定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 iRotateAngle;
// 创建对话框
CDlgGeoRota dlgPara;
// 初始化变量值
dlgPara.m_iRotateAngle = 90;
// 显示对话框,提示用户设定旋转角度
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
iRotateAngle = dlgPara.m_iRotateAngle;
// 删除对话框
delete dlgPara;
// 创建新DIB
HDIB hNewDIB = NULL;
// 更改光标形状
BeginWaitCursor();
// 调用RotateDIB()函数旋转DIB
hNewDIB = (HDIB) RotateDIB(lpDIB, iRotateAngle);
// 判断旋转是否成功
if (hNewDIB != NULL)
{
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
//////////////////////////////////////////////////////////////////////////////////////
// 图像增强
//
void CCh1_1View::OnEnhaSmooth()
{
// 图像平滑
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 模板高度
int iTempH;
// 模板宽度
int iTempW;
// 模板系数
FLOAT fTempC;
// 模板中心元素X坐标
int iTempMX;
// 模板中心元素Y坐标
int iTempMY;
// 模板元素数组
FLOAT aValue[25];
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的平滑!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 创建对话框
CDlgSmooth dlgPara;
// 给模板数组赋初值(为平均模板)
aValue[0] = 1.0;
aValue[1] = 1.0;
aValue[2] = 1.0;
aValue[3] = 0.0;
aValue[4] = 0.0;
aValue[5] = 1.0;
aValue[6] = 1.0;
aValue[7] = 1.0;
aValue[8] = 0.0;
aValue[9] = 0.0;
aValue[10] = 1.0;
aValue[11] = 1.0;
aValue[12] = 1.0;
aValue[13] = 0.0;
aValue[14] = 0.0;
aValue[15] = 0.0;
aValue[16] = 0.0;
aValue[17] = 0.0;
aValue[18] = 0.0;
aValue[19] = 0.0;
aValue[20] = 0.0;
aValue[21] = 0.0;
aValue[22] = 0.0;
aValue[23] = 0.0;
aValue[24] = 0.0;
// 初始化对话框变量值
dlgPara.m_intType = 0;
dlgPara.m_iTempH = 3;
dlgPara.m_iTempW = 3;
dlgPara.m_iTempMX = 1;
dlgPara.m_iTempMY = 1;
dlgPara.m_fTempC = (FLOAT) (1.0 / 9.0);
dlgPara.m_fpArray = aValue;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
iTempH = dlgPara.m_iTempH;
iTempW = dlgPara.m_iTempW;
iTempMX = dlgPara.m_iTempMX;
iTempMY = dlgPara.m_iTempMY;
fTempC = dlgPara.m_fTempC;
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
// 调用Template()函数平滑DIB
if (::Template(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),
iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CCh1_1View::OnENHAMidianF()
{
// 中值滤波
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 滤波器的高度
int iFilterH;
// 滤波器的宽度
int iFilterW;
// 中心元素的X坐标
int iFilterMX;
// 中心元素的Y坐标
int iFilterMY;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的中值滤波,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的中值滤波!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 创建对话框
CDlgMidFilter dlgPara;
// 初始化变量值
dlgPara.m_iFilterType = 0;
dlgPara.m_iFilterH = 3;
dlgPara.m_iFilterW = 1;
dlgPara.m_iFilterMX = 0;
dlgPara.m_iFilterMY = 1;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户的设定
iFilterH = dlgPara.m_iFilterH;
iFilterW = dlgPara.m_iFilterW;
iFilterMX = dlgPara.m_iFilterMX;
iFilterMY = dlgPara.m_iFilterMY;
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
// 调用MedianFilter()函数中值滤波
if (::MedianFilter(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),
iFilterH, iFilterW, iFilterMX, iFilterMY))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CCh1_1View::OnEnhaGradsharp()
{
// 梯度锐化
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的梯度锐化,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的梯度锐化!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 阈值
BYTE bThre;
// 创建对话框
CDlgSharpThre dlgPara;
// 初始化变量值
dlgPara.m_bThre = 10;
// 提示用户输入阈值
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户的设定
bThre = dlgPara.m_bThre;
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
// 调用GradSharp()函数进行梯度板锐化
if (::GradSharp(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), bThre))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CCh1_1View::OnEnhaSharp()
{
// 图像锐化
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 模板高度
int iTempH;
// 模板宽度
int iTempW;
// 模板系数
FLOAT fTempC;
// 模板中心元素X坐标
int iTempMX;
// 模板中心元素Y坐标
int iTempMY;
// 模板元素数组
FLOAT aValue[9];
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的锐化,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的锐化!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// 设置拉普拉斯模板参数
iTempW = 3;
iTempH = 3;
fTempC = 1.0;
iTempMX = 1;
iTempMY = 1;
aValue[0] = -1.0;
aValue[1] = -1.0;
aValue[2] = -1.0;
aValue[3] = -1.0;
aValue[4] = 9.0;
aValue[5] = -1.0;
aValue[6] = -1.0;
aValue[7] = -1.0;
aValue[8] = -1.0;
// 调用Template()函数用拉普拉斯模板锐化DIB
if (::Template(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),
iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -