www.pudn.com > Image_Manage.rar > Image_ManageView.cpp
// Image_ManageView.cpp : implementation of the CImage_ManageView class
//
#include "stdafx.h"
#include "Image_Manage.h"
#include "MainFrm.h"
#include "Image_ManageDoc.h"
#include "Image_ManageView.h"
// Header files of Dialog
#include "DlgSmooth.h"
#include "DlgSharpThre.h"
#include "DlgMidFilter.h"
#include "DlgHist.h"
#include "DlgGrid.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CImage_ManageView
IMPLEMENT_DYNCREATE(CImage_ManageView, CScrollView)
BEGIN_MESSAGE_MAP(CImage_ManageView, CScrollView)
//{{AFX_MSG_MAP(CImage_ManageView)
ON_COMMAND(ID_SMOOTH_A, OnSmoothA)
ON_COMMAND(ID_SMOOTH_G, OnSmoothG)
ON_COMMAND(ID_SMOOTH_S, OnSmoothS)
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
ON_COMMAND(ID_SHARP_G, OnSharpG)
ON_COMMAND(ID_SHARP_L, OnSharpL)
ON_COMMAND(ID_MIDIAM_F, OnMidiamF)
ON_COMMAND(ID_EDGE_GAUSS, OnEdgeGauss)
ON_COMMAND(ID_EDGE_KIRSCH, OnEdgeKirsch)
ON_COMMAND(ID_EDGE_PREWITT, OnEdgePrewitt)
ON_COMMAND(ID_EDGE_ROBERT, OnEdgeRobert)
ON_COMMAND(ID_EDGE_SOBEL, OnEdgeSobel)
ON_COMMAND(ID_TRANS_GRAY, OnTransGray)
ON_COMMAND(ID_GRAY_HIST, OnGrayHist)
ON_COMMAND(ID_GRAY_GRID, OnGrayGrid)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImage_ManageView construction/destruction
CImage_ManageView::CImage_ManageView()
{
// TODO: add construction code here
}
CImage_ManageView::~CImage_ManageView()
{
}
BOOL CImage_ManageView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CImage_ManageView drawing
void CImage_ManageView::OnDraw(CDC* pDC)
{
// 显示等待光标
BeginWaitCursor();
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// 获取DIB
HDIB hDIB = pDoc->GetHDIB();
// 判断DIB是否为空
if (hDIB != NULL)
{
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
// 获取DIB宽度
int cxDIB = (int) ::DIBWidth(lpDIB);
// 获取DIB高度
int cyDIB = (int) ::DIBHeight(lpDIB);
::GlobalUnlock((HGLOBAL) hDIB);
CRect rcDIB;
rcDIB.top = rcDIB.left = 0;
rcDIB.right = cxDIB;
rcDIB.bottom = cyDIB;
CRect rcDest;
// 判断是否是打印
if (pDC->IsPrinting())
{
// 是打印,计算输出图像的位置和大小,以便符合页面
// 获取打印页面的水平宽度(象素)
int cxPage = pDC->GetDeviceCaps(HORZRES);
// 获取打印页面的垂直高度(象素)
int cyPage = pDC->GetDeviceCaps(VERTRES);
// 获取打印机每英寸象素数
int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
// 计算打印图像大小(缩放,根据页面宽度调整图像大小)
rcDest.top = rcDest.left = 0;
rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch)
/ ((double)cxDIB * cxInch));
rcDest.right = cxPage;
// 计算打印图像位置(垂直居中)
int temp = cyPage - (rcDest.bottom - rcDest.top);
rcDest.bottom += temp/2;
rcDest.top += temp/2;
}
else
// 非打印
{
// 不必缩放图像
rcDest = rcDIB;
}
// 输出DIB
::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(),
&rcDIB, pDoc->GetDocPalette());
}
// 恢复正常光标
EndWaitCursor();
}
void CImage_ManageView::OnInitialUpdate()
{
SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());
}
/////////////////////////////////////////////////////////////////////////////
// CImage_ManageView printing
BOOL CImage_ManageView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CImage_ManageView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CImage_ManageView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CImage_ManageView diagnostics
#ifdef _DEBUG
void CImage_ManageView::AssertValid() const
{
CScrollView::AssertValid();
}
void CImage_ManageView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CImage_ManageDoc* CImage_ManageView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImage_ManageDoc)));
return (CImage_ManageDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CImage_ManageView message handlers
void CImage_ManageView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
{
CScrollView::OnInitialUpdate();
}
void CImage_ManageView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
// TODO: Add your specialized code here and/or call the base class
CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);
if (bActivate)
{
ASSERT(pActivateView == this);
OnDoRealize((WPARAM)m_hWnd, 0); // same as SendMessage(WM_DOREALIZE);
}
}
LRESULT CImage_ManageView::OnDoRealize(WPARAM wParam, LPARAM)
{
ASSERT(wParam != NULL);
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 判断DIB是否为空
if (pDoc->GetHDIB() == NULL)
{
// 直接返回
return 0L;
}
// 获取Palette
CPalette* pPal = pDoc->GetDocPalette();
if (pPal != NULL)
{
// 获取MainFrame
CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
ASSERT_KINDOF(CMainFrame, pAppFrame);
CClientDC appDC(pAppFrame);
// All views but one should be a background palette.
// wParam contains a handle to the active view, so the SelectPalette
// bForceBackground flag is FALSE only if wParam == m_hWnd (this view)
CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd);
if (oldPalette != NULL)
{
UINT nColorsChanged = appDC.RealizePalette();
if (nColorsChanged > 0)
pDoc->UpdateAllViews(NULL);
appDC.SelectPalette(oldPalette, TRUE);
}
else
{
TRACE0("\tCCh1_1View::OnPaletteChanged中调用SelectPalette()失败!\n");
}
}
return 0L;
}
//////////////////////////////////////////////////////////////////////////////
//
// 编辑菜单响应处理函数
//
void CImage_ManageView::OnEditCopy()
{
// 复制当前图像
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 打开剪贴板
if (OpenClipboard())
{
// 更改光标形状
BeginWaitCursor();
// 清空剪贴板
EmptyClipboard();
// 复制当前图像到剪贴板
SetClipboardData (CF_DIB, CopyHandle((HANDLE) pDoc->GetHDIB()) );
// 关闭剪贴板
CloseClipboard();
// 恢复光标
EndWaitCursor();
}
}
void CImage_ManageView::OnUpdateEditCopy(CCmdUI* pCmdUI)
{
// 如果当前DIB对象不空,复制菜单项有效
pCmdUI->Enable(GetDocument()->GetHDIB() != NULL);
}
void CImage_ManageView::OnEditPaste()
{
// 粘贴图像
// 创建新DIB
HDIB hNewDIB = NULL;
// 打开剪贴板
if (OpenClipboard())
{
// 更改光标形状
BeginWaitCursor();
// 读取剪贴板中的图像
hNewDIB = (HDIB) CopyHandle(::GetClipboardData(CF_DIB));
// 关闭剪贴板
CloseClipboard();
// 判断是否读取成功
if (hNewDIB != NULL)
{
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 实现新的调色板
OnDoRealize((WPARAM)m_hWnd,0);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
// 恢复光标
EndWaitCursor();
}
}
void CImage_ManageView::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
// 如果当前剪贴板中有DIB对象,粘贴菜单项有效
pCmdUI->Enable(::IsClipboardFormatAvailable(CF_DIB));
}
void CImage_ManageView::OnEditUndo()
{
OnEditPaste();
}
void CImage_ManageView::OnUpdateEditUndo(CCmdUI* pCmdUI)
{
pCmdUI->Enable(GetDocument()->IsModified());
}
////////////////////////////////////////////////////////////////////////////////////
//
// 平滑去噪菜单响应处理函数
//
void CImage_ManageView::DoSmooth(int iTempH, int iTempW, int iTempMX, int iTempMY, FLOAT *fpArray, FLOAT fCoef)
{
// 平滑去噪
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 每个像素占用的位
int nBitCount;
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 得到每个像素的位数
nBitCount = ::DIBBitCount(lpDIB);
// 滤除不为处理的图像格式
if(nBitCount!=8 && nBitCount!=24)
{
CString szMsg;
szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount);
AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return ;
}
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 调用SmoothDIB()函数变换图像
if (::Template(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),
iTempH, iTempW, iTempMX, iTempMY, fpArray, fCoef, nBitCount))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CImage_ManageView::OnSmoothA()
{
// 平滑去噪 - 平均模板(3×3)
// 模板高度
int iTempH=3;
// 模板宽度
int iTempW=3;
// 模板系数
FLOAT fTempC=(FLOAT)0.111111;
// 模板中心元素X坐标
int iTempMX=1;
// 模板中心元素Y坐标
int iTempMY=1;
// 模板元素数组
FLOAT aValue[9];
// 给模板数组赋初值(为平均模板)
for(int i=0;i<9;i++) // 1 1 1
aValue[i] = 1.0; // 1 1 1
// 1 1 1
// 调用DoSmooth函数改变图像数据
DoSmooth(iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC);
}
void CImage_ManageView::OnSmoothG()
{
// 平滑去噪 - 高斯模板(3×3)
// 模板高度
int iTempH=3;
// 模板宽度
int iTempW=3;
// 模板系数
FLOAT fTempC=(FLOAT)0.0625;
// 模板中心元素X坐标
int iTempMX=1;
// 模板中心元素Y坐标
int iTempMY=1;
// 模板元素数组
FLOAT aValue[9];
// 给模板数组赋初值(为平均模板)
for(int i=0;i<9;i++)
{ // 1 2 1
aValue[i] = i%3 == 1 ? (FLOAT)2.0 : (FLOAT)1.0; // 2 4 2
aValue[i] = i/3 == 1 ? (FLOAT)2.0*aValue[i] : aValue[i]; // 1 2 1
}
// 调用DoSmooth函数改变图像数据
DoSmooth(iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC);
}
void CImage_ManageView::OnSmoothS()
{
// 平滑去噪 - 自定义模板
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 每个像素占用的位
int nBitCount;
// 指向DIB的指针
LPSTR lpDIB;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 得到每个像素的位数
nBitCount = ::DIBBitCount(lpDIB);
// 滤除不为处理的图像格式
if(nBitCount!=8 && nBitCount!=24)
{
CString szMsg;
szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount);
AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return ;
}
// 模板高度
int iTempH;
// 模板宽度
int iTempW;
// 模板系数
FLOAT fTempC;
// 模板中心元素X坐标
int iTempMX;
// 模板中心元素Y坐标
int iTempMY;
// 模板元素数组
FLOAT aValue[25];
// 创建对话框
CDlgSmooth dlgPara;
// 显示对话框,提示用户设定平移量
if(dlgPara.DoModal()!=IDOK)
{
// 删除对话框
delete dlgPara;
// 返回
return ;
}
// 获取用户设定的平移量
iTempH = dlgPara.m_iTempH;
iTempW = dlgPara.m_iTempW;
iTempMX = dlgPara.m_iTempMX;
iTempMY = dlgPara.m_iTempMY;
fTempC = dlgPara.m_fTempC;
for(int i=0;i<25;i++)
aValue[i]=dlgPara.m_fpArray[i];
// 调用DoSmooth函数改变图像数据
DoSmooth(iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC);
// 删除对话框
delete dlgPara;
}
////////////////////////////////////////////////////////////////////////////////////
//
// 平滑去噪菜单响应处理函数
//
void CImage_ManageView::OnSharpG()
{
// 梯度锐化
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 每个像素占用的位
int nBitCount;
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 得到每个像素的位数
nBitCount = ::DIBBitCount(lpDIB);
// 滤除不为处理的图像格式
if(nBitCount!=8 && nBitCount!=24)
{
CString szMsg;
szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount);
AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return ;
}
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 阈值
BYTE bThre;
// 创建对话框
CDlgSharpThre dlgPara;
// 初始化变量值
dlgPara.m_bThre = 100;
// 提示用户输入阈值
if (dlgPara.DoModal() != IDOK)
{
// 删除对话框
delete dlgPara;
// 返回
return;
}
// 获取用户的设定
bThre = dlgPara.m_bThre;
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
// 调用GradSharp()函数进行梯度板锐化
if (::GradSharp(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), bThre, nBitCount))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CImage_ManageView::OnSharpL()
{
// 图像锐化
// 模板高度
int iTempH;
// 模板宽度
int iTempW;
// 模板系数
FLOAT fTempC;
// 模板中心元素X坐标
int iTempMX;
// 模板中心元素Y坐标
int iTempMY;
// 模板元素数组
FLOAT aValue[9];
// 设置拉普拉斯模板参数
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;
// 调用DoSmooth函数改变图像数据
DoSmooth(iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC);
}
////////////////////////////////////////////////////////////////////////////////////
//
// 中值滤波菜单响应处理函数
//
void CImage_ManageView::OnMidiamF()
{
// 中值滤波
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 每个像素占用的位
int nBitCount;
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 得到每个像素的位数
nBitCount = ::DIBBitCount(lpDIB);
// 滤除不为处理的图像格式
if(nBitCount!=8 && nBitCount!=24)
{
CString szMsg;
szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount);
AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return ;
}
// 滤波器的高度
int iFilterH;
// 滤波器的宽度
int iFilterW;
// 中心元素的X坐标
int iFilterMX;
// 中心元素的Y坐标
int iFilterMY;
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 创建对话框
CDlgMidFilter dlgPara;
// 显示对话框,提示用户设定平移量
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, nBitCount))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
////////////////////////////////////////////////////////////////////////////////////
//
// 边缘检测菜单响应处理函数
//
void CImage_ManageView::OnEdgeGauss()
{
//Gauss边缘检测运算
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 每个像素占用的位
int nBitCount;
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 得到每个像素的位数
nBitCount = ::DIBBitCount(lpDIB);
// 滤除不为处理的图像格式
if(nBitCount!=8 && nBitCount!=24)
{
CString szMsg;
szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount);
AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return ;
}
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 调用GaussDIB()函数对DIB进行边缘检测
if (GaussDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nBitCount))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CImage_ManageView::OnEdgeKirsch()
{
//Kirsch边缘检测运算
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 每个像素占用的位
int nBitCount;
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 得到每个像素的位数
nBitCount = ::DIBBitCount(lpDIB);
// 滤除不为处理的图像格式
if(nBitCount!=8 && nBitCount!=24)
{
CString szMsg;
szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount);
AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return ;
}
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 调用KirschDIB()函数对DIB进行边缘检测
if (KirschDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nBitCount))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CImage_ManageView::OnEdgePrewitt()
{
//Prewitt边缘检测运算
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 每个像素占用的位
int nBitCount;
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 得到每个像素的位数
nBitCount = ::DIBBitCount(lpDIB);
// 滤除不为处理的图像格式
if(nBitCount!=8 && nBitCount!=24)
{
CString szMsg;
szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount);
AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return ;
}
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 调用PrewittDIB()函数对DIB进行边缘检测
if (PrewittDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nBitCount))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CImage_ManageView::OnEdgeRobert()
{
//Robert边缘检测运算
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 每个像素占用的位
int nBitCount;
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 得到每个像素的位数
nBitCount = ::DIBBitCount(lpDIB);
// 滤除不为处理的图像格式
if(nBitCount!=8 && nBitCount!=24)
{
CString szMsg;
szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount);
AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return ;
}
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 调用RobertDIB()函数对DIB进行边缘检测
if (RobertDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nBitCount))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CImage_ManageView::OnEdgeSobel()
{
//Sobel边缘检测运算
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 每个像素占用的位
int nBitCount;
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 得到每个像素的位数
nBitCount = ::DIBBitCount(lpDIB);
// 滤除不为处理的图像格式
if(nBitCount!=8 && nBitCount!=24)
{
CString szMsg;
szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount);
AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return ;
}
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 调用SobelDIB()函数对DIB进行边缘检测
if (SobelDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nBitCount))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
////////////////////////////////////////////////////////////////////////////////////
//
// 图像转换菜单响应处理函数
//
void CImage_ManageView::OnTransGray()
{
// 真彩色图像转换为256色图像运算
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 每个像素占用的位
int nBitCount;
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 得到每个像素的位数
nBitCount = ::DIBBitCount(lpDIB);
// 滤除不为处理的图像格式
if(nBitCount!=24)
{
CString szMsg;
szMsg.Format(TEXT("此操作只支持24位真彩色位图.\n你打开的位图为%d位."),nBitCount);
AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return ;
}
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 调用To256DIB()函数对DIB进行图像转换
if (To256DIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
////////////////////////////////////////////////////////////////////////////////////
//
// 图像识别菜单响应处理函数
//
void CImage_ManageView::OnGrayHist()
{
// 直方图处理函数
// 获取文档
CImage_ManageDoc* pDoc = GetDocument();
// 每个像素占用的位
int nBitCount;
LONG i,j;
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 得到每个像素的位数
nBitCount = ::DIBBitCount(lpDIB);
// 滤除不为处理的图像格式
if(nBitCount!=8 && nBitCount!=24)
{
CString szMsg;
szMsg.Format(TEXT("此操作只支持8位或24位位图.\n你打开的位图为%d位."),nBitCount);
AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return ;
}
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
CDlgHist dlgPara;
LONG lWidth=::DIBWidth(lpDIB);
LONG lHeight=::DIBHeight(lpDIB);
BYTE bTemp;
// 清零
for(i=0;i<256;i++)
dlgPara.hist[i]=0;
switch(nBitCount)
{
case 8:
unsigned char* lpSrc;
for(i=0;ilWidth)
lWidth=dlgPara.hist[i];
}
// 找系数
lWidth=lWidth/240;
for(i=0;i<256;i++)
{
dlgPara.hist[i]=dlgPara.hist[i] / lWidth;
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
//显示直方图
dlgPara.DoModal();
delete dlgPara;
}
void CImage_ManageView::OnGrayGrid()
{
// 网格图处理函数
// 创建对话框
CDlgGrid dlgPara;
// 显示网格对话框
dlgPara.DoModal();
// 删除对话框
delete dlgPara;
}