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" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /***************************************************** * * 函数名称: * Template: * * 参数: * HDIB hDIB -图像的句柄 * double *tem -指向模板的指针 * int tem_w -模板的宽度 * int tem_h -模板的高度 * double xishu -模板的系数 * * 功能: * 对图像进行模板操作 * * 说明: * 为处理方便起见,模板的宽度和高度都应为奇数 *******************************************************/ HDIB Template(HDIB hDIB,double * tem ,int tem_w,int tem_h,double xishu) { //统计中间值 double sum; //指向图像起始位置的指针 BYTE *lpDIB=(BYTE*)::GlobalLock((HGLOBAL) hDIB); //指向象素起始位置的指针 BYTE *pScrBuff =(BYTE*)::FindDIBBits((char*)lpDIB); //获取图像的颜色信息 int numColors=(int) ::DIBNumColors((char *)lpDIB); //如果图像不是256色返回 if (numColors!=256) { //解除锁定 ::GlobalUnlock((HGLOBAL) hDIB); //返回 return(hDIB); } //将指向图像象素起始位置的指针,赋值给指针变量 BYTE* oldbuf = pScrBuff; //循环变量 int i,j,m,n; int w, h, dw; //获取图像的宽度 w = (int) ::DIBWidth((char *)lpDIB); //获取图像的高度 h = (int) ::DIBHeight((char *)lpDIB); //计算图像每行的字节数 dw = (w+3)/4*4; //建立一个和原图像大小相同的25色灰度位图 HDIB newhDIB=NewDIB(w,h,8); //指向新的位图的指针 BYTE *newlpDIB=(BYTE*)::GlobalLock((HGLOBAL) newhDIB); //指向新的位图的象素起始位置的指针 BYTE *destBuf = (BYTE*)FindDIBBits((char *)newlpDIB); //将指向新图像象素起始位置的指针,赋值给指针变量 BYTE *newbuf=destBuf; //对图像进行扫描 //行 for(i=0;i<h;i++) { //列 for(j=0;j<w;j++) { //为统计变量赋初始值 sum=0; //对于图像的4个边框的象素保持原灰度不变 if( j<((tem_w-1)/2) || j>(w-(tem_w+1)/2) || i<((tem_h-1)/2) || i>(h-(tem_h+1)/2) ) *(newbuf+i*dw+j)=*(oldbuf+i*dw+j); //对于其他的象素进行模板操作 else { //将点(i,j)点作为模板的中心 for(m=i-((tem_h-1)/2);m<=i+((tem_h-1)/2);m++) { for(n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++) //将以点(i,j)为中心,与模板大小相同的范围内的象素与模板对用位置的系数 //进行相乘并线形叠加 sum+=*(oldbuf+m*dw+n)* tem[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)]; } //将结果乘上总的模板系数 sum=(int)sum*xishu; //计算绝对值 sum = fabs(sum); //如果小于0,强制赋值为0 if(sum<0) sum=0; //如果大于255,强制赋值为255 if(sum>255) sum=255; //将计算的结果放到新的位图的相应位置 *(newbuf+i*dw+j)=sum; } } } //解除锁定 ::GlobalUnlock((HGLOBAL)hDIB); //返回新的位图的句柄 return(newhDIB); } ///////////////////////////////////////////////////////////////////////////// // 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() { // TODO: Add your command handler code here CMyDIPDoc* pDoc = GetDocument(); //设定模板参数 double tem[9]={1,2,1, 2,4,2, 1,2,1}; //设定模板系数 double xishu = 0.0625; //进行模板操作 pDoc->m_hDIB =Template(pDoc->m_hDIB,tem ,3,3, xishu); Invalidate(TRUE); }