?? ch1_1view.cpp
字號(hào):
if (::Template(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),
iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC))
{
// 設(shè)置臟標(biāo)記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內(nèi)存失敗!", "系統(tǒng)提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復(fù)光標(biāo)
EndWaitCursor();
}
void CCh1_1View::OnEnhaColor()
{
// 偽彩色編碼
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 保存用戶選擇的偽彩色編碼表索引
int nColor;
// 指向DIB的指針
LPSTR lpDIB;
// 鎖定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判斷是否是8-bpp位圖(只處理256色位圖的偽彩色變換,其它的可以類推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用戶
MessageBox("目前只支持256色位圖的偽彩色變換!", "系統(tǒng)提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 參數(shù)對話框
CDlgColor dlgPara;
// 初始化變量值
if (pDoc->m_nColorIndex >= 0)
{
// 初始選中當(dāng)前的偽彩色
dlgPara.m_nColor = pDoc->m_nColorIndex;
}
else
{
// 初始選中灰度偽彩色編碼表
dlgPara.m_nColor = 0;
}
// 指向名稱數(shù)組的指針
dlgPara.m_lpColorName = (LPSTR) ColorScaleName;
// 偽彩色編碼數(shù)目
dlgPara.m_nColorCount = COLOR_SCALE_COUNT;
// 名稱字符串長度
dlgPara.m_nNameLen = sizeof(ColorScaleName) / COLOR_SCALE_COUNT;
// 顯示對話框,提示用戶設(shè)定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 獲取用戶的設(shè)定
nColor = dlgPara.m_nColor;
// 刪除對話框
delete dlgPara;
// 更改光標(biāo)形狀
BeginWaitCursor();
// 判斷偽彩色編碼是否改動(dòng)
if (pDoc->m_nColorIndex != nColor)
{
// 調(diào)用ReplaceColorPal()函數(shù)變換調(diào)色板
::ReplaceColorPal(lpDIB, (BYTE*) ColorsTable[nColor]);
// 替換當(dāng)前文檔調(diào)色板
pDoc->GetDocPalette()->SetPaletteEntries(0, 256, (LPPALETTEENTRY) ColorsTable[nColor]);
// 更新類成員變量
pDoc->m_nColorIndex = nColor;
// 設(shè)置臟標(biāo)記
pDoc->SetModifiedFlag(TRUE);
// 實(shí)現(xiàn)新的調(diào)色板
OnDoRealize((WPARAM)m_hWnd,0);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復(fù)光標(biāo)
EndWaitCursor();
}
void CCh1_1View::OnFILE256ToGray()
{
// 將256色位圖轉(zhuǎn)換成灰度圖
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 鎖定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 顏色表中的顏色數(shù)目
WORD wNumColors;
// 獲取DIB中顏色表中的顏色數(shù)目
wNumColors = ::DIBNumColors(lpDIB);
// 判斷是否是8-bpp位圖
if (wNumColors != 256)
{
// 提示用戶
MessageBox("非256色位圖!", "系統(tǒng)提示" , MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光標(biāo)形狀
BeginWaitCursor();
// 指向DIB象素指針
LPSTR lpDIBBits;
// 指向DIB象素的指針
BYTE * lpSrc;
// 循環(huán)變量
LONG i;
LONG j;
// 圖像寬度
LONG lWidth;
// 圖像高度
LONG lHeight;
// 圖像每行的字節(jié)數(shù)
LONG lLineBytes;
// 指向BITMAPINFO結(jié)構(gòu)的指針(Win3.0)
LPBITMAPINFO lpbmi;
// 指向BITMAPCOREINFO結(jié)構(gòu)的指針
LPBITMAPCOREINFO lpbmc;
// 表明是否是Win3.0 DIB的標(biāo)記
BOOL bWinStyleDIB;
// 獲取指向BITMAPINFO結(jié)構(gòu)的指針(Win3.0)
lpbmi = (LPBITMAPINFO)lpDIB;
// 獲取指向BITMAPCOREINFO結(jié)構(gòu)的指針
lpbmc = (LPBITMAPCOREINFO)lpDIB;
// 灰度映射表
BYTE bMap[256];
// 判斷是否是WIN3.0的DIB
bWinStyleDIB = IS_WIN30_DIB(lpDIB);
// 計(jì)算灰度映射表(保存各個(gè)顏色的灰度值),并更新DIB調(diào)色板
for (i = 0; i < 256; i ++)
{
if (bWinStyleDIB)
{
// 計(jì)算該顏色對應(yīng)的灰度值
bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +
0.587 * lpbmi->bmiColors[i].rgbGreen +
0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);
// 更新DIB調(diào)色板紅色分量
lpbmi->bmiColors[i].rgbRed = i;
// 更新DIB調(diào)色板綠色分量
lpbmi->bmiColors[i].rgbGreen = i;
// 更新DIB調(diào)色板藍(lán)色分量
lpbmi->bmiColors[i].rgbBlue = i;
// 更新DIB調(diào)色板保留位
lpbmi->bmiColors[i].rgbReserved = 0;
}
else
{
// 計(jì)算該顏色對應(yīng)的灰度值
bMap[i] = (BYTE)(0.299 * lpbmc->bmciColors[i].rgbtRed +
0.587 * lpbmc->bmciColors[i].rgbtGreen +
0.114 * lpbmc->bmciColors[i].rgbtBlue + 0.5);
// 更新DIB調(diào)色板紅色分量
lpbmc->bmciColors[i].rgbtRed = i;
// 更新DIB調(diào)色板綠色分量
lpbmc->bmciColors[i].rgbtGreen = i;
// 更新DIB調(diào)色板藍(lán)色分量
lpbmc->bmciColors[i].rgbtBlue = i;
}
}
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 獲取圖像寬度
lWidth = ::DIBWidth(lpDIB);
// 獲取圖像高度
lHeight = ::DIBHeight(lpDIB);
// 計(jì)算圖像每行的字節(jié)數(shù)
lLineBytes = WIDTHBYTES(lWidth * 8);
// 更換每個(gè)象素的顏色索引(即按照灰度映射表換成灰度值)
// 每行
for(i = 0; i < lHeight; i++)
{
// 每列
for(j = 0; j < lWidth; j++)
{
// 指向DIB第i行,第j個(gè)象素的指針
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
// 變換
*lpSrc = bMap[*lpSrc];
}
}
// 替換當(dāng)前調(diào)色板為灰度調(diào)色板
pDoc->GetDocPalette()->SetPaletteEntries(0, 256, (LPPALETTEENTRY) ColorsTable[0]);
// 設(shè)置臟標(biāo)記
pDoc->SetModifiedFlag(TRUE);
// 實(shí)現(xiàn)新的調(diào)色板
OnDoRealize((WPARAM)m_hWnd,0);
// 更新視圖
pDoc->UpdateAllViews(NULL);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復(fù)光標(biāo)
EndWaitCursor();
}
//////////////////////////////////////////////////////////////////////////////////////
// 圖像正交變換
//
void CCh1_1View::OnFreqFour()
{
// 圖像付立葉變換
// 獲取文檔
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色位圖的付立葉變換!", "系統(tǒng)提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光標(biāo)形狀
BeginWaitCursor();
// 調(diào)用Fourier()函數(shù)進(jìn)行付立葉變換
if (::Fourier(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))
{
// 設(shè)置臟標(biāo)記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內(nèi)存失敗!", "系統(tǒng)提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復(fù)光標(biāo)
EndWaitCursor();
}
void CCh1_1View::OnFreqDct()
{
// 圖像離散余弦變換
// 獲取文檔
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色位圖的離散余弦變換!", "系統(tǒng)提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光標(biāo)形狀
BeginWaitCursor();
// 調(diào)用DIBDct()函數(shù)進(jìn)行離散余弦變換
if (::DIBDct(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))
{
// 設(shè)置臟標(biāo)記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內(nèi)存失敗!", "系統(tǒng)提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復(fù)光標(biāo)
EndWaitCursor();
}
void CCh1_1View::OnFreqWalh()
{
// 圖像沃爾什-哈達(dá)瑪變換
// 獲取文檔
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位圖的沃爾什-哈達(dá)瑪變換,其它的可以類推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用戶
MessageBox("目前只支持256色位圖的沃爾什-哈達(dá)瑪變換!", "系統(tǒng)提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光標(biāo)形狀
BeginWaitCursor();
// 調(diào)用DIBWalsh()或者DIBWalsh1()函數(shù)進(jìn)行變換
if (::DIBWalsh1(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))
{
// 設(shè)置臟標(biāo)記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內(nèi)存失敗!", "系統(tǒng)提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復(fù)光標(biāo)
EndWaitCursor();
}
//////////////////////////////////////////////////////////////////////////////////////
// 形態(tài)學(xué)變換
//
void CCh1_1View::OnMorphErosion()
{
//腐蝕運(yùn)算
// 獲取文檔
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色位圖的腐蝕!", "系統(tǒng)提示" , MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
int nMode;
// 創(chuàng)建對話框
cDlgMorphErosion dlgPara;
// 初始化變量值
dlgPara.m_nMode = 0;
// 顯示對話框,提示用戶設(shè)定腐蝕方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 獲取用戶設(shè)定的腐蝕方向
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;
// 更改光標(biāo)形狀
BeginWaitCursor();
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 調(diào)用ErosionDIB()函數(shù)腐蝕DIB
if (ErosionDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nMode , structure))
{
// 設(shè)置臟標(biāo)記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內(nèi)存失敗或者圖像中含有0和255之外的像素值!", "系統(tǒng)提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復(fù)光標(biāo)
EndWaitCursor();
}
void CCh1_1View::OnMorphOpen()
{
//開運(yùn)算
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 指向DIB象素指針
LPSTR lpDIBBits;
// 鎖定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判斷是否是8-bpp位圖(這里為了方便,只處理8-bpp位圖的開運(yùn)算,其它的可以類推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用戶
MessageBox("目前只支持256色位圖的開運(yùn)算!", "系統(tǒng)提示" , MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
int nMode;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -