📄 directview.cpp
字号:
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
// 调用HprojectDIB()函数对DIB进行水平投影
if (pDoc->GetDibImage()->HprojectDIB(lpDIBBits,
pDoc->GetDibImage()->DIBWidth(lpDIB),
pDoc->GetDibImage()->DIBHeight(lpDIB)))
{
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
void CDirectView::OnDetectMinus()
{
// 获取文档
CDirectDoc* pDoc = GetDocument();
LPSTR lpDIB,lpDIBBK; // 指向DIB的指针
LPSTR lpDIBBits,lpDIBBitsBK; // 指向DIB象素指针
long lWidth,lHeight; //图像的宽度与高度
HDIB hDIBBK;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的平移!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
lWidth = pDoc->GetDibImage()->DIBWidth(lpDIB);
lHeight = pDoc->GetDibImage()->DIBHeight(lpDIB);
CFileDialog dlg(TRUE,"bmp","*.bmp");
if(dlg.DoModal() == IDOK)
{
CFile file;
CFileException fe;
CString strPathName;
strPathName = dlg.GetPathName();
VERIFY(file.Open(strPathName,CFile::modeRead|CFile::shareDenyWrite,&fe));
TRY
{
hDIBBK = pDoc->GetDibImage()->ReadDIBFile(file);
}
CATCH (CFileException, eLoad)
{
file.Abort();
EndWaitCursor();
hDIBBK = NULL;
return;
}
END_CATCH
if (hDIBBK == NULL)
{
CString strMsg;
strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
MessageBox(strMsg, NULL, MB_ICONINFORMATION | MB_OK);
EndWaitCursor();
return;
}
}
else
{
EndWaitCursor();
return;
}
lpDIBBK = (LPSTR) ::GlobalLock((HGLOBAL) hDIBBK);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的差影,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIBBK) != 256)
{
MessageBox("目前只支持256色位图!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) hDIBBK);
return;
}
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBitsBK = pDoc->GetDibImage()->FindDIBBits(lpDIBBK);
// 调用AddMinusDIB()函数相减两幅DIB
if(pDoc->GetDibImage()->AddMinusDIB(lpDIBBits,lpDIBBitsBK,lWidth,lHeight,false))
{
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
::GlobalUnlock((HGLOBAL) hDIBBK);
EndWaitCursor();
}
void CDirectView::OnDetectTemplate()
{
CDirectDoc* pDoc = GetDocument();
LPSTR lpDIB,lpTemplateDIB; // 指向DIB的指针
LPSTR lpDIBBits,lpTemplateDIBBits; // 指向DIB象素指针
long lWidth,lHeight; //图像的宽度与高度
long lTemplateWidth,lTemplateHeight; //模板的宽度与高度
HDIB hTemplateDIB;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的平移!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
lWidth = pDoc->GetDibImage()->DIBWidth(lpDIB);
lHeight = pDoc->GetDibImage()->DIBHeight(lpDIB);
CFileDialog dlg(TRUE,"bmp","*.bmp");
if(dlg.DoModal() == IDOK)
{
CFile file;
CFileException fe;
CString strPathName;
strPathName = dlg.GetPathName();
VERIFY(file.Open(strPathName,CFile::modeRead|CFile::shareDenyWrite,&fe));
TRY
{
hTemplateDIB = pDoc->GetDibImage()->ReadDIBFile(file);
}
CATCH (CFileException, eLoad)
{
file.Abort();
EndWaitCursor();
hTemplateDIB = NULL;
return;
}
END_CATCH
if (hTemplateDIB == NULL)
{
CString strMsg;
strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
MessageBox(strMsg, NULL, MB_ICONINFORMATION | MB_OK);
EndWaitCursor();
return;
}
}
else
{
EndWaitCursor();
return;
}
lpTemplateDIB = (LPSTR) ::GlobalLock((HGLOBAL) hTemplateDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的模板匹配,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpTemplateDIB) != 256)
{
MessageBox("目前只支持256色位图!","系统提示",MB_ICONINFORMATION|MB_OK);
::GlobalUnlock((HGLOBAL) hTemplateDIB);
return;
}
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpTemplateDIBBits = pDoc->GetDibImage()->FindDIBBits(lpTemplateDIB);
lTemplateWidth = pDoc->GetDibImage()->DIBWidth(lpTemplateDIB);
lTemplateHeight = pDoc->GetDibImage()->DIBHeight(lpTemplateDIB);
if(lTemplateHeight > lHeight || lTemplateWidth > lWidth )
{
MessageBox("模板尺寸大于源图像尺寸!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) hTemplateDIB);
return;
}
// 调用TemplateMatchDIB()函数进行模板匹配
if (pDoc->GetDibImage()->TemplateMatchDIB(lpDIBBits,lpTemplateDIBBits,
lWidth,lHeight, lTemplateWidth,lTemplateHeight))
{
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
::GlobalUnlock((HGLOBAL) hTemplateDIB);
EndWaitCursor();
}
void CDirectView::OnDetectThreshold()
{
//阈值分割
CDirectDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
LPSTR lpDIBBits; // 指向DIB象素指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的阈值分割,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的运算!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
// 调用ThresholdDIB()函数对DIB进行阈值分割
if (pDoc->GetDibImage()->ThresholdDIB(lpDIBBits,
pDoc->GetDibImage()->DIBWidth(lpDIB),
pDoc->GetDibImage()->DIBHeight(lpDIB)))
{
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
void CDirectView::OnDetectVprojection()
{
//垂直投影
CDirectDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
LPSTR lpDIBBits; // 指向DIB象素指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的投影,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的运算!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
// 调用VprojectDIB()函数对DIB进行垂直投影
if (pDoc->GetDibImage()->VprojectDIB(lpDIBBits,
pDoc->GetDibImage()->DIBWidth(lpDIB),
pDoc->GetDibImage()->DIBHeight(lpDIB)))
{
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -