📄 templatetransview.cpp
字号:
EndWaitCursor();
}
void CTemplateTransView::OnEnhaGradsharp()
{
// 梯度锐化
CTemplateTransDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
LPSTR lpDIBBits; // 指向DIB象素指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的梯度锐化,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的梯度锐化!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
BYTE bThre; // 阈值
CSharpThreDlg dlgPara;
dlgPara.m_bThre = 10;
// 提示用户输入阈值
if (dlgPara.DoModal() != IDOK)
{
return;
}
bThre = dlgPara.m_bThre;
delete dlgPara;
BeginWaitCursor();
// 调用GradSharp()函数进行梯度板锐化
if (pDoc->GetDibImage()->GradSharp(lpDIBBits,
pDoc->GetDibImage()->DIBWidth(lpDIB),
pDoc->GetDibImage()->DIBHeight(lpDIB), bThre))
{
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
void CTemplateTransView::OnENHAMidianF()
{
// 中值滤波
CTemplateTransDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
LPSTR lpDIBBits; // 指向DIB象素指针
int iFilterH; // 滤波器的高度
int iFilterW; // 滤波器的宽度
int iFilterMX; // 中心元素的X坐标
int iFilterMY; // 中心元素的Y坐标
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的中值滤波,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的中值滤波!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
CMidFilterDlg 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 (pDoc->GetDibImage()->MedianFilter(lpDIBBits,
pDoc->GetDibImage()->DIBWidth(lpDIB), pDoc->GetDibImage()->
DIBHeight(lpDIB), iFilterH, iFilterW, iFilterMX, iFilterMY))
{
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
void CTemplateTransView::OnEnhaSharp()
{
// 图像锐化
CTemplateTransDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
LPSTR lpDIBBits; // 指向DIB象素指针
int iTempH; // 模板高度
int iTempW; // 模板宽度
FLOAT fTempC; // 模板系数
int iTempMX; // 模板中心元素X坐标
int iTempMY; // 模板中心元素Y坐标
FLOAT aValue[9]; // 模板元素数组
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的锐化,其它的可以类推)
if (pDoc->GetDibImage()->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 (pDoc->GetDibImage()->Template(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB),
pDoc->GetDibImage()->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 CTemplateTransView::OnEnhaSmooth()
{
// 图像平滑
CTemplateTransDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
LPSTR lpDIBBits; // 指向DIB象素指针
int iTempH; // 模板高度
int iTempW; // 模板宽度
FLOAT fTempC; // 模板系数
int iTempMX; // 模板中心元素X坐标
int iTempMY; // 模板中心元素Y坐标
FLOAT aValue[25]; // 模板元素数组
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的平滑!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
CSmoothDlg 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 (pDoc->GetDibImage()->Template(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB),
pDoc->GetDibImage()->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 CTemplateTransView::OnFILE256ToGray()
{
// 将256色位图转换成灰度图
CTemplateTransDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
WORD wNumColors; // DIB中颜色表中的颜色数目
wNumColors = pDoc->GetDibImage()->DIBNumColors(lpDIB);
// 判断是否是8-bpp位图
if (wNumColors != 256)
{
MessageBox("非256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
BeginWaitCursor();
LPSTR lpDIBBits; // 指向DIB象素指针
BYTE * lpSrc; // 指向DIB象素的指针
LONG i,j; // 循环变量
LONG lWidth; // 图像宽度
LONG lHeight; // 图像高度
LONG lLineBytes; // 图像每行的字节数
LPBITMAPINFO lpbmi; // 指向BITMAPINFO结构的指针(Win3.0)
LPBITMAPCOREINFO lpbmc; // 指向BITMAPCOREINFO结构的指针
BOOL bWinStyleDIB; // 表明是否是Win3.0 DIB的标记
lpbmi = (LPBITMAPINFO)lpDIB;// 获取指向BITMAPINFO结构的指针(Win3.0)
lpbmc = (LPBITMAPCOREINFO)lpDIB; // 获取指向BITMAPCOREINFO结构的指针
BYTE bMap[256]; // 灰度映射表
bWinStyleDIB = IS_WIN30_DIB(lpDIB); // 判断是否是WIN3.0的DIB
// 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
for (i = 0; i < 256; i ++)
{
if (bWinStyleDIB)
{
// 计算该颜色对应的灰度值
bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +
0.587 * lpbmi->bmiColors[i].rgbGreen +
0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);
// 更新DIB调色板红色绿色蓝色分量
lpbmi->bmiColors[i].rgbRed = i;
lpbmi->bmiColors[i].rgbGreen = i;
lpbmi->bmiColors[i].rgbBlue = i;
// 更新DIB调色板保留位
lpbmi->bmiColors[i].rgbReserved = 0;
}
else
{
// 计算该颜色对应的灰度值
bMap[i] = (BYTE)(0.299 * lpbmc->bmciColors[i].rgbtRed +
0.587 * lpbmc->bmciColors[i].rgbtGreen +
0.114 * lpbmc->bmciColors[i].rgbtBlue + 0.5);
// 更新DIB调色板红色绿色蓝色分量
lpbmc->bmciColors[i].rgbtRed = i;
lpbmc->bmciColors[i].rgbtGreen = i;
lpbmc->bmciColors[i].rgbtBlue = i;
}
}
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);// 找到DIB图像象素起始位置
lWidth = pDoc->GetDibImage()->DIBWidth(lpDIB); // 获取图像宽度
lHeight = pDoc->GetDibImage()->DIBHeight(lpDIB);// 获取图像高度
lLineBytes = WIDTHBYTES(lWidth * 8); // 计算图像每行的字节数
// 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)
for(i = 0; i < lHeight; i++) // 每行
{
for(j = 0; j < lWidth; j++) // 每列
{
// 指向DIB第i行,第j个象素的指针
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
*lpSrc = bMap[*lpSrc]; // 变换
}
}
// 替换当前调色板为灰度调色板
pDoc->GetDocPalette()->SetPaletteEntries(0,256,(LPPALETTEENTRY)ColorsTable[0]);
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
OnDoRealize((WPARAM)m_hWnd,0); // 实现新的调色板
pDoc->UpdateAllViews(NULL); // 更新视图
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -