bsView.cpp
上传用户:yuzhuan
上传日期:2013-03-16
资源大小:3596k
文件大小:8k
源码类别:

2D图形编程

开发平台:

Visual C++

  1. // bsView.cpp : implementation of the CBsView class
  2. //
  3. #include "stdafx.h"
  4. #include "bs.h"
  5. #include "bsDoc.h"
  6. #include "bsView.h"
  7. #include "Dib.h"
  8. #include "math.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CBsView
  16. IMPLEMENT_DYNCREATE(CBsView, CView)
  17. BEGIN_MESSAGE_MAP(CBsView, CView)
  18. //{{AFX_MSG_MAP(CBsView)
  19. ON_COMMAND(ID_OPERATE, OnOperate)
  20. ON_COMMAND(ID_FILE_OPENB, OnFileOpenb)
  21. ON_COMMAND(ID_FILE_OPENO, OnFileOpeno)
  22. //}}AFX_MSG_MAP
  23. // Standard printing commands
  24. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  25. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  26. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  27. END_MESSAGE_MAP()
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CBsView construction/destruction
  30. #define WIDTH(bytes) (((bytes*8+31)/32)*4)
  31. #define WIDETHBYTES(i)   ((i+31)/32*4)
  32. CBsView::CBsView()
  33. {
  34. // TODO: add construction code here
  35. valid=false;
  36. }
  37. CBsView::~CBsView()
  38. {
  39. }
  40. BOOL CBsView::PreCreateWindow(CREATESTRUCT& cs)
  41. {
  42. // TODO: Modify the Window class or styles here by modifying
  43. //  the CREATESTRUCT cs
  44. return CView::PreCreateWindow(cs);
  45. }
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CBsView drawing
  48. void CBsView::OnDraw(CDC* pDC)
  49. {
  50. CBsDoc* pDoc = GetDocument();
  51. ASSERT_VALID(pDoc);
  52. if(valid)
  53. {
  54. int m_scale=1;//控制缩放比例 
  55. BYTE *pBmpData=dib->GetData();
  56.     LPBITMAPINFO pBmpInfo=dib->GetInfo();
  57. int bmpHeight=dib->GetHeight();
  58.     int bmpWidth=dib->GetWidth();
  59. int scaleHeight=(int)(m_scale*bmpHeight);
  60. int scaleWidth=(int)(m_scale*bmpWidth);
  61. if(dib->GetRGB())
  62. {
  63. CPalette *hPalette=dib->CreateBmpPalette();
  64. CPalette *hOldPalette=pDC->SelectPalette(hPalette,true);
  65. pDC->RealizePalette();
  66. ::StretchDIBits(pDC->GetSafeHdc(),0,0,scaleWidth,scaleHeight,0,0,bmpWidth,bmpHeight,
  67. pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
  68. pDC->SelectPalette(hOldPalette,true);
  69. ::DeleteObject(hPalette);
  70. }
  71. ::StretchDIBits(pDC->GetSafeHdc(),0,0,scaleWidth,scaleHeight,0,0,bmpWidth,bmpHeight,
  72. pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
  73. }
  74. }
  75. /////////////////////////////////////////////////////////////////////////////
  76. // CBsView printing
  77. BOOL CBsView::OnPreparePrinting(CPrintInfo* pInfo)
  78. {
  79. // default preparation
  80. return DoPreparePrinting(pInfo);
  81. }
  82. void CBsView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  83. {
  84. // TODO: add extra initialization before printing
  85. }
  86. void CBsView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  87. {
  88. // TODO: add cleanup after printing
  89. }
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CBsView diagnostics
  92. #ifdef _DEBUG
  93. void CBsView::AssertValid() const
  94. {
  95. CView::AssertValid();
  96. }
  97. void CBsView::Dump(CDumpContext& dc) const
  98. {
  99. CView::Dump(dc);
  100. }
  101. CBsDoc* CBsView::GetDocument() // non-debug version is inline
  102. {
  103. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBsDoc)));
  104. return (CBsDoc*)m_pDocument;
  105. }
  106. #endif //_DEBUG
  107. /////////////////////////////////////////////////////////////////////////////
  108. // CBsView message handlers
  109. /*void CBsView::Sub(LPBYTE p_data,  LPBYTE p_dataBK,int wide,int height,int bitcount)
  110. {
  111. int i,j,k,wh;
  112. LPBYTE lpSrc[3];//原图像像素指针
  113. LPBYTE lpDst[3];//目标像素指针
  114. LPBYTE lpSrcBK[3];//背景像素指针
  115. wh=WIDETHBYTES(wide*bitcount);
  116. LPBYTE temp=new BYTE[height*wh];//新图像缓冲区
  117. memset(temp,255,height*wh);//初始化新分配的内存为255
  118. for(j=0;j<height;j++)//进行每个像素的减运算
  119. {
  120. for(i=0;i<wh/3;i++)
  121.   //获得原像素指针
  122. {
  123. for(k=0;k<3;k++)
  124. {
  125. lpSrc[k]=p_data+(wh*j+i*3+k);
  126. //获得目标像素指针
  127. lpDst[k]=temp+(wh*j+i*3+k);
  128. //获得背景像素指针
  129. lpSrcBK[k]=p_dataBK+(wh*j+i*3+k);
  130. }
  131. //进行减运算
  132. if(fabs(*lpSrc[0]-*lpSrcBK[0])<25&&fabs(*lpSrc[1]-*lpSrcBK[1])<25&&fabs(*lpSrc[2]-*lpSrcBK[2])<25)
  133. { *lpDst[0]=0;
  134. *lpDst[1]=0;
  135. *lpDst[2]=0;
  136. }
  137. else
  138. {   *lpDst[0]=255;
  139.     *lpDst[1]=255;
  140. *lpDst[2]=255;
  141. }
  142. }
  143. }
  144. memcpy(p_data,temp,height*wh);//复制处理后的图像
  145. delete temp;
  146. }*/
  147. void CBsView::Sub(BYTE *p_data,  BYTE *p_dataBK,int wide,int height,DWORD size)
  148. {
  149. int i,j,r;
  150. LPBYTE lpSrc;//原图像像素指针
  151. LPBYTE lpDst=new BYTE[size];//目标像素指针
  152. LPBYTE lpSrcBK;//背景像素指针
  153. LPBYTE temp=new BYTE[3];//新图像缓冲区
  154. memset(lpDst,255,size);//初始化新分配的内存为255
  155. memset(temp,255,3);
  156. for(j=0;j<height;j++)//进行每个像素的减运算
  157. {
  158. r=0;//用于判断是否是象素的起始字节
  159. for(i=0;i<WIDTH(3*wide);i++)
  160. {  
  161. r++;
  162. //获得原像素指针
  163. lpSrc=p_data+WIDTH(3*wide)*j+i;
  164. //获得目标像素指针
  165. // lpDst=temp+wide*j+i;
  166. //获得背景像素指针
  167. lpSrcBK=p_dataBK+WIDTH(3*wide)*j+i;
  168. temp[r%3]=*lpSrc-*lpSrcBK;
  169. //进行减运算
  170. if(r%3==0)
  171. {
  172. // if(temp[0]==0||temp[1]==0||temp[2]==0)
  173. if(fabs(temp[0])<25||fabs(temp[1])<25||fabs(temp[2])<25)
  174. {
  175. lpDst[WIDTH(3*wide)*j+i]=0;
  176. lpDst[WIDTH(3*wide)*j+i-1]=0;
  177. lpDst[WIDTH(3*wide)*j+i-2]=0;
  178. }
  179. else
  180. {
  181. lpDst[WIDTH(3*wide)*j+i]=255;
  182. lpDst[WIDTH(3*wide)*j+i-1]=255;
  183. lpDst[WIDTH(3*wide)*j+i-2]=255;
  184. }
  185. }
  186. }
  187. }
  188. memcpy(p_data,lpDst,size);//复制处理后的图像
  189. delete temp,lpDst;
  190. }
  191. void CBsView::OnOperate() 
  192. {
  193. // Sub(dib1.m_pData,dib2.m_pData,dib2.GetWidth(),dib2.GetHeight(),(dib2.m_pBitmapInfoHeader)->biBitCount); 
  194. Sub(dib1.m_pData,dib2.m_pData,dib2.GetWidth(),dib2.GetHeight(),dib2.GetSize());
  195. dib=&dib1;
  196. mid(dib,3);
  197. valid=true;
  198. Invalidate(); //更新 OnDraw()函数 
  199. }
  200. void CBsView::OnFileOpenb() 
  201. {
  202. CFileDialog dlg2(TRUE,".bmp|*.*",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位图文件(*.bmp)|*.bmp|All Files (*.*)|*.*||",NULL);   //设置打开文件为“ .TXT”
  203. // CFileDialog dlg2(  TRUE,_T("TXT"),_T("*.TXT"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T(" 文本文件  (*.TXT)|*.TXT|")); 
  204. if(IDOK==dlg2.DoModal()) 
  205. {
  206.  dib2.LoadFile(dlg2.GetPathName());
  207.  dib=&dib2; 
  208.  valid=true;
  209.  Invalidate(); }//更新 OnDraw()函数 
  210. }
  211. void CBsView::OnFileOpeno() 
  212. {
  213. CFileDialog dlg1(TRUE,".bmp|*.*",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位图文件(*.bmp)|*.bmp|All Files (*.*)|*.*||",NULL);   //设置打开文件为“ .TXT”
  214. if(IDOK==dlg1.DoModal()) 
  215. {
  216.    dib1.LoadFile(dlg1.GetPathName());
  217.  dib=&dib1;
  218.  valid=true;
  219.  Invalidate();} //更新 OnDraw()函数 
  220. }
  221. void CBsView::mid(CDib *dib0,int n)
  222. {//n为窗口的边长
  223. DWORD size;
  224. size=dib0->GetSize();//得到图像的大小,以字节为单位
  225. int ywindow,xwindow,nhalf,nn,m,k,chg,winm,mid0,win[1000];
  226. BYTE *p_data;//原图像象素指针
  227. int wide,height;
  228. BYTE *p_temp=new BYTE[size];//
  229. nhalf=(n-1)/2;//求出窗口一半的长度
  230. nn=n*n;//窗口大小
  231. mid0=(nn-1)/2;//用于存放求出的中值
  232. p_data=dib0->GetData();//取得原图的数据区指针
  233. memset(p_temp,255,size);
  234. wide=dib0->GetWidth();//取得原图的数据区宽
  235. height=dib0->GetHeight();
  236. for(int j=nhalf;j<height-nhalf;j++)//窗口中心象素的起始位置
  237. for(int i=nhalf;i<wide-nhalf;i++) 
  238. {
  239. //把N*N屏蔽窗口部分复制到mode[m]
  240. m=0;
  241. for(ywindow=j-nhalf;ywindow<=j+nhalf;ywindow++)//窗口内的象素
  242.         for(xwindow=i-nhalf;xwindow<=i+nhalf;xwindow++)
  243. {
  244. for(k=0;k<3;k++)
  245. {
  246. win[3*m+k]=p_data[(ywindow*WIDTH(3*wide)+3*xwindow)+k];
  247. }
  248. m++;
  249. }
  250. do{
  251. chg=0;
  252. for(m=0;m<nn-1;m++)
  253. {
  254. 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])
  255. {
  256. for(k=0;k<3;k++)
  257. {
  258. winm=win[3*m+k];
  259. win[3*m+k]=win[3*(m+1)+k];
  260. win[3*(m+1)+k]=winm;
  261. }
  262. chg=1;
  263. }
  264. }
  265. }while(chg==1);
  266. for(k=0;k<3;k++)
  267. {
  268. p_temp[j*WIDTH(3*wide)+3*i+k]=win[3*mid0+k];
  269. }
  270. }
  271. memcpy(p_data,p_temp,size);
  272. delete p_temp;
  273. }