bsView.cpp
资源名称:图像处理毕业设计.rar [点击查看]
上传用户:yuzhuan
上传日期:2013-03-16
资源大小:3596k
文件大小:8k
源码类别:
2D图形编程
开发平台:
Visual C++
- // bsView.cpp : implementation of the CBsView class
- //
- #include "stdafx.h"
- #include "bs.h"
- #include "bsDoc.h"
- #include "bsView.h"
- #include "Dib.h"
- #include "math.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CBsView
- IMPLEMENT_DYNCREATE(CBsView, CView)
- BEGIN_MESSAGE_MAP(CBsView, CView)
- //{{AFX_MSG_MAP(CBsView)
- ON_COMMAND(ID_OPERATE, OnOperate)
- ON_COMMAND(ID_FILE_OPENB, OnFileOpenb)
- ON_COMMAND(ID_FILE_OPENO, OnFileOpeno)
- //}}AFX_MSG_MAP
- // Standard printing commands
- ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
- ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
- ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CBsView construction/destruction
- #define WIDTH(bytes) (((bytes*8+31)/32)*4)
- #define WIDETHBYTES(i) ((i+31)/32*4)
- CBsView::CBsView()
- {
- // TODO: add construction code here
- valid=false;
- }
- CBsView::~CBsView()
- {
- }
- BOOL CBsView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Modify the Window class or styles here by modifying
- // the CREATESTRUCT cs
- return CView::PreCreateWindow(cs);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CBsView drawing
- void CBsView::OnDraw(CDC* pDC)
- {
- CBsDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- if(valid)
- {
- int m_scale=1;//控制缩放比例
- BYTE *pBmpData=dib->GetData();
- LPBITMAPINFO pBmpInfo=dib->GetInfo();
- int bmpHeight=dib->GetHeight();
- int bmpWidth=dib->GetWidth();
- int scaleHeight=(int)(m_scale*bmpHeight);
- int scaleWidth=(int)(m_scale*bmpWidth);
- if(dib->GetRGB())
- {
- CPalette *hPalette=dib->CreateBmpPalette();
- CPalette *hOldPalette=pDC->SelectPalette(hPalette,true);
- pDC->RealizePalette();
- ::StretchDIBits(pDC->GetSafeHdc(),0,0,scaleWidth,scaleHeight,0,0,bmpWidth,bmpHeight,
- pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
- pDC->SelectPalette(hOldPalette,true);
- ::DeleteObject(hPalette);
- }
- ::StretchDIBits(pDC->GetSafeHdc(),0,0,scaleWidth,scaleHeight,0,0,bmpWidth,bmpHeight,
- pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
- }
- }
- /////////////////////////////////////////////////////////////////////////////
- // CBsView printing
- BOOL CBsView::OnPreparePrinting(CPrintInfo* pInfo)
- {
- // default preparation
- return DoPreparePrinting(pInfo);
- }
- void CBsView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
- {
- // TODO: add extra initialization before printing
- }
- void CBsView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
- {
- // TODO: add cleanup after printing
- }
- /////////////////////////////////////////////////////////////////////////////
- // CBsView diagnostics
- #ifdef _DEBUG
- void CBsView::AssertValid() const
- {
- CView::AssertValid();
- }
- void CBsView::Dump(CDumpContext& dc) const
- {
- CView::Dump(dc);
- }
- CBsDoc* CBsView::GetDocument() // non-debug version is inline
- {
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBsDoc)));
- return (CBsDoc*)m_pDocument;
- }
- #endif //_DEBUG
- /////////////////////////////////////////////////////////////////////////////
- // CBsView message handlers
- /*void CBsView::Sub(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height,int bitcount)
- {
- int i,j,k,wh;
- LPBYTE lpSrc[3];//原图像像素指针
- LPBYTE lpDst[3];//目标像素指针
- LPBYTE lpSrcBK[3];//背景像素指针
- wh=WIDETHBYTES(wide*bitcount);
- LPBYTE temp=new BYTE[height*wh];//新图像缓冲区
- memset(temp,255,height*wh);//初始化新分配的内存为255
- for(j=0;j<height;j++)//进行每个像素的减运算
- {
- for(i=0;i<wh/3;i++)
- //获得原像素指针
- {
- for(k=0;k<3;k++)
- {
- lpSrc[k]=p_data+(wh*j+i*3+k);
- //获得目标像素指针
- lpDst[k]=temp+(wh*j+i*3+k);
- //获得背景像素指针
- lpSrcBK[k]=p_dataBK+(wh*j+i*3+k);
- }
- //进行减运算
- if(fabs(*lpSrc[0]-*lpSrcBK[0])<25&&fabs(*lpSrc[1]-*lpSrcBK[1])<25&&fabs(*lpSrc[2]-*lpSrcBK[2])<25)
- { *lpDst[0]=0;
- *lpDst[1]=0;
- *lpDst[2]=0;
- }
- else
- { *lpDst[0]=255;
- *lpDst[1]=255;
- *lpDst[2]=255;
- }
- }
- }
- memcpy(p_data,temp,height*wh);//复制处理后的图像
- delete temp;
- }*/
- void CBsView::Sub(BYTE *p_data, BYTE *p_dataBK,int wide,int height,DWORD size)
- {
- int i,j,r;
- LPBYTE lpSrc;//原图像像素指针
- LPBYTE lpDst=new BYTE[size];//目标像素指针
- LPBYTE lpSrcBK;//背景像素指针
- LPBYTE temp=new BYTE[3];//新图像缓冲区
- memset(lpDst,255,size);//初始化新分配的内存为255
- memset(temp,255,3);
- for(j=0;j<height;j++)//进行每个像素的减运算
- {
- r=0;//用于判断是否是象素的起始字节
- for(i=0;i<WIDTH(3*wide);i++)
- {
- r++;
- //获得原像素指针
- lpSrc=p_data+WIDTH(3*wide)*j+i;
- //获得目标像素指针
- // lpDst=temp+wide*j+i;
- //获得背景像素指针
- lpSrcBK=p_dataBK+WIDTH(3*wide)*j+i;
- temp[r%3]=*lpSrc-*lpSrcBK;
- //进行减运算
- if(r%3==0)
- {
- // if(temp[0]==0||temp[1]==0||temp[2]==0)
- if(fabs(temp[0])<25||fabs(temp[1])<25||fabs(temp[2])<25)
- {
- lpDst[WIDTH(3*wide)*j+i]=0;
- lpDst[WIDTH(3*wide)*j+i-1]=0;
- lpDst[WIDTH(3*wide)*j+i-2]=0;
- }
- else
- {
- lpDst[WIDTH(3*wide)*j+i]=255;
- lpDst[WIDTH(3*wide)*j+i-1]=255;
- lpDst[WIDTH(3*wide)*j+i-2]=255;
- }
- }
- }
- }
- memcpy(p_data,lpDst,size);//复制处理后的图像
- delete temp,lpDst;
- }
- void CBsView::OnOperate()
- {
- // Sub(dib1.m_pData,dib2.m_pData,dib2.GetWidth(),dib2.GetHeight(),(dib2.m_pBitmapInfoHeader)->biBitCount);
- Sub(dib1.m_pData,dib2.m_pData,dib2.GetWidth(),dib2.GetHeight(),dib2.GetSize());
- dib=&dib1;
- mid(dib,3);
- valid=true;
- Invalidate(); //更新 OnDraw()函数
- }
- void CBsView::OnFileOpenb()
- {
- CFileDialog dlg2(TRUE,".bmp|*.*",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位图文件(*.bmp)|*.bmp|All Files (*.*)|*.*||",NULL); //设置打开文件为“ .TXT”
- // CFileDialog dlg2( TRUE,_T("TXT"),_T("*.TXT"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T(" 文本文件 (*.TXT)|*.TXT|"));
- if(IDOK==dlg2.DoModal())
- {
- dib2.LoadFile(dlg2.GetPathName());
- dib=&dib2;
- valid=true;
- Invalidate(); }//更新 OnDraw()函数
- }
- void CBsView::OnFileOpeno()
- {
- CFileDialog dlg1(TRUE,".bmp|*.*",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位图文件(*.bmp)|*.bmp|All Files (*.*)|*.*||",NULL); //设置打开文件为“ .TXT”
- if(IDOK==dlg1.DoModal())
- {
- dib1.LoadFile(dlg1.GetPathName());
- dib=&dib1;
- valid=true;
- Invalidate();} //更新 OnDraw()函数
- }
- void CBsView::mid(CDib *dib0,int n)
- {//n为窗口的边长
- DWORD size;
- size=dib0->GetSize();//得到图像的大小,以字节为单位
- int ywindow,xwindow,nhalf,nn,m,k,chg,winm,mid0,win[1000];
- BYTE *p_data;//原图像象素指针
- int wide,height;
- BYTE *p_temp=new BYTE[size];//
- nhalf=(n-1)/2;//求出窗口一半的长度
- nn=n*n;//窗口大小
- mid0=(nn-1)/2;//用于存放求出的中值
- p_data=dib0->GetData();//取得原图的数据区指针
- memset(p_temp,255,size);
- wide=dib0->GetWidth();//取得原图的数据区宽
- height=dib0->GetHeight();
- for(int j=nhalf;j<height-nhalf;j++)//窗口中心象素的起始位置
- for(int i=nhalf;i<wide-nhalf;i++)
- {
- //把N*N屏蔽窗口部分复制到mode[m]
- m=0;
- for(ywindow=j-nhalf;ywindow<=j+nhalf;ywindow++)//窗口内的象素
- for(xwindow=i-nhalf;xwindow<=i+nhalf;xwindow++)
- {
- for(k=0;k<3;k++)
- {
- win[3*m+k]=p_data[(ywindow*WIDTH(3*wide)+3*xwindow)+k];
- }
- m++;
- }
- do{
- chg=0;
- for(m=0;m<nn-1;m++)
- {
- if(win[3*m]>win[3*(m+1)]||win[3*m+1]>win[3*(m+1)+1]||win[3*m+2]>win[3*(m+1)+2])
- {
- for(k=0;k<3;k++)
- {
- winm=win[3*m+k];
- win[3*m+k]=win[3*(m+1)+k];
- win[3*(m+1)+k]=winm;
- }
- chg=1;
- }
- }
- }while(chg==1);
- for(k=0;k<3;k++)
- {
- p_temp[j*WIDTH(3*wide)+3*i+k]=win[3*mid0+k];
- }
- }
- memcpy(p_data,p_temp,size);
- delete p_temp;
- }