www.gusucode.com > VC++直方图均衡处理实例源码程序 > VC++直方图均衡处理实例源码程序/code/源代码/MyDIPView.cpp
//Download by http://www.NewXing.com // MyDIPView.cpp : implementation of the CMyDIPView class // #include "stdafx.h" #include "MyDIP.h" #include "MyDIPDoc.h" #include "MyDIPView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /************************************************************************* 直方图均衡子函数 ************************************************************************/ BOOL WINAPI InteEqualize(LPSTR lpDIBBits, LONG lWidth, LONG lHeight) { // 指向源图像的指针 unsigned char* lpSrc; // 临时变量 LONG lTemp; // 循环变量 LONG i; LONG j; // 灰度映射表 BYTE bMap[256]; // 灰度映射表 LONG lCount[256]; // 图像每行的字节数 LONG lLineBytes; // 计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8); // 重置计数为0 for (i = 0; i < 256; i ++) { // 清零 lCount[i] = 0; } // 计算各个灰度值的计数 for (i = 0; i < lHeight; i ++) { for (j = 0; j < lWidth; j ++) { lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j; // 计数加1 lCount[*(lpSrc)]++; } } // 计算灰度映射表 for (i = 0; i < 256; i++) { // 初始为0 lTemp = 0; for (j = 0; j <= i ; j++) { lTemp += lCount[j]; } // 计算对应的新灰度值 bMap[i] = (BYTE) (lTemp * 255 / lHeight / lWidth); } // 每行 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]; } } // 返回 return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CMyDIPView IMPLEMENT_DYNCREATE(CMyDIPView, CScrollView) BEGIN_MESSAGE_MAP(CMyDIPView, CScrollView) //{{AFX_MSG_MAP(CMyDIPView) ON_COMMAND(ID_MENUITEM32778, OnMenuitem32778) //}}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() ///////////////////////////////////////////////////////////////////////////// // CMyDIPView construction/destruction CMyDIPView::CMyDIPView() { // TODO: add construction code here } CMyDIPView::~CMyDIPView() { } BOOL CMyDIPView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CScrollView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CMyDIPView drawing void CMyDIPView::OnDraw(CDC* pDC) { CMyDIPDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(pDoc->m_hDIB == NULL) return ; // TODO: add draw code for native data here int i,j; unsigned char *lpSrc; LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB); int cxDIB = (int) ::DIBWidth(lpDIB); // Size of DIB - x int cyDIB = (int) ::DIBHeight(lpDIB); // Size of DIB - y LPSTR lpDIBBits=::FindDIBBits (lpDIB); // 计算图像每行的字节数 long lLineBytes = WIDTHBYTES(cxDIB * 8); // 每行 for(i = 0; i < cyDIB; i++) { // 每列 for(j = 0; j < cxDIB; j++) { // 指向DIB第i行,第j个象素的指针 lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (cyDIB - 1 - i) + j; // 计算新的灰度值 //*(lpSrc) = BYTE(255-*lpSrc); } } ::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); CRect rect(0,0,cxDIB,cyDIB), rcDIB(0,0,cxDIB,cyDIB); ::PaintDIB(pDC->m_hDC, &rect, pDoc->m_hDIB, &rcDIB, pDoc->m_palDIB); } ///////////////////////////////////////////////////////////////////////////// // CMyDIPView printing BOOL CMyDIPView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CMyDIPView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CMyDIPView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CMyDIPView diagnostics #ifdef _DEBUG void CMyDIPView::AssertValid() const { CScrollView::AssertValid(); } void CMyDIPView::Dump(CDumpContext& dc) const { CScrollView::Dump(dc); } CMyDIPDoc* CMyDIPView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDIPDoc))); return (CMyDIPDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMyDIPView message handlers void CMyDIPView::OnSize(UINT nType, int cx, int cy) { CScrollView::OnSize(nType, cx, cy); } void CMyDIPView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); SetScrollSizes(MM_TEXT, GetDocument()->m_sizeDoc); } //对比度拉伸 //DEL void CMyDIPView::OnMenuitem32777() //DEL { //DEL //DEL // 获取文档 //DEL CMyDIPDoc* pDoc = GetDocument(); //DEL int i,j; //DEL int r1=60,r2=200; //DEL double k=1.5; //DEL unsigned char *lpSrc; //DEL ASSERT_VALID(pDoc); //DEL if(pDoc->m_hDIB == NULL) //DEL return ; //DEL LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB); //DEL LPSTR lpDIBBits=::FindDIBBits (lpDIB); //DEL int cxDIB = (int) ::DIBWidth(lpDIB); // Size of DIB - x //DEL int cyDIB = (int) ::DIBHeight(lpDIB); // Size of DIB - y //DEL long lLineBytes = WIDTHBYTES(cxDIB * 8); // 计算图像每行的字节数 //DEL // 每行 //DEL for(i = 0; i < cyDIB; i++) //DEL { //DEL // 每列 //DEL for(j = 0; j < cxDIB; j++) //DEL { //DEL // 指向DIB第i行,第j个象素的指针 //DEL lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (cyDIB - 1 - i) + j; //DEL // 计算新的灰度值 //DEL if(*lpSrc<r1) *lpSrc=BYTE(*lpSrc/k); //DEL else if(*lpSrc<r2) *lpSrc= BYTE((*lpSrc-r1)*k+r1/k); //DEL else *lpSrc=BYTE((*lpSrc-r2)/k+255-(255-r2)/k); //DEL } //DEL } //DEL ::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); //DEL Invalidate(TRUE); //DEL } void CMyDIPView::OnMenuitem32778() { // 灰度均衡 // 获取文档 CMyDIPDoc* 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; } // 更改光标形状 BeginWaitCursor(); // 调用InteEqualize()函数进行直方图均衡 InteEqualize(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }