TuXiangHeChengDib.cpp
Upload User: szkelitina
Upload Date: 2022-05-21
Package Size: 6797k
Code Size: 18k
Category:

Special Effects

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "windowsx.h"
  3. #include "math.h"
  4. #include "TuXiangHeChengDib.h"
  5. #include "MainFrm.h"
  6. #include "DynSplitView2.h"
  7.  
  8.  
  9. TuXiangHeChengDib::TuXiangHeChengDib()
  10. {
  11. bool m_valid=true;
  12. }
  13. TuXiangHeChengDib::~TuXiangHeChengDib()
  14. {
  15. }
  16. ///***************************************************************/           
  17. /*函数名称:Add(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
  18. /*函数类型:void 
  19. /*参数说明:p_data       原图像首地址
  20. /*          p_dataBK     背景图像首地址
  21. /*          wide,height 原图像的高和宽                                   
  22. /*功能:对图像进行加运算。            
  23. /***************************************************************/ 
  24. void TuXiangHeChengDib::Add(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)
  25. {
  26. LPBYTE lpSrc;  //原图像像素指针
  27.     LPBYTE lpDst;   //目标像素指针
  28.     LPBYTE lpSrcBK;  //背景像素指针
  29. if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
  30. {
  31. int i,j;  //循环变量
  32. LPBYTE  temp=new BYTE[wide*height];    //新图像缓冲区
  33. //初始化新分配的内存为255
  34. memset(temp,255,wide*height);
  35. //进行每个像素的加运算
  36. for(j=1;j<height-1;j++)
  37. {
  38. for(i=1;i<wide-1;i++)
  39. {
  40. //获得原像素指针
  41. lpSrc=p_data+wide*j+i;
  42. //获得目标像素指针
  43. lpDst=temp+wide*j+i;
  44. //获得背景像素指针
  45. lpSrcBK=p_dataBK+wide*j+i;
  46. //进行加运算
  47. if((*lpSrc+*lpSrcBK)>255)
  48. *lpDst=255;
  49. else
  50. *lpDst=(*lpSrc+*lpSrcBK);
  51. }
  52. }
  53. memcpy(p_data, temp,wide*height);   //复制处理后的图像
  54. delete  temp;
  55. }
  56. else //24位真彩色
  57. {
  58. LONG wide,height,DibWidth;    //原图长、宽
  59. p_data=this->GetData ();   //取得原图的数据区指针
  60. wide=this->GetWidth ();  //取得原图的数据区宽度
  61. height=this->GetHeight ();   //取得原图的数据区高度
  62. DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
  63. BYTE *p_temp=new BYTE[height*DibWidth];
  64. //进行每个像素的加运算
  65. for(int j=1;j<height-1;j++)
  66. {
  67. for(int i=3;i<DibWidth-3;i++)
  68. {
  69. //获得原像素指针
  70. lpSrc=p_data+DibWidth*j+i;
  71. //获得目标像素指针
  72. lpDst=p_temp+DibWidth*j+i;
  73. //获得背景像素指针
  74. lpSrcBK=p_dataBK+DibWidth*j+i;
  75. //进行加运算
  76. if((*lpSrc+*lpSrcBK)>255)
  77. *lpDst=255;
  78. else
  79. *lpDst=(*lpSrc+*lpSrcBK);
  80. }
  81. }
  82. memcpy(p_data, p_temp,DibWidth*height);   //复制处理后的图像
  83. delete  []p_temp;
  84. }
  85. }
  86. ///***************************************************************/           
  87. /*函数名称:Sub(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
  88. /*函数类型:void 
  89. /*参数说明:p_data       原图像首地址
  90. /*          p_dataBK     背景图像首地址
  91. /*          wide,height 原图像的高和宽                                   
  92. /*功能:对图像进行减运算。            
  93. /***************************************************************/ 
  94. void TuXiangHeChengDib::Sub(LPBYTE p_data, LPBYTE p_dataBK, int wide, int height)
  95. {
  96. LPBYTE lpSrc;  //原图像像素指针
  97.     LPBYTE lpDst;   //目标像素指针
  98.     LPBYTE lpSrcBK;  //背景像素指针
  99.     if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
  100. {
  101. int i,j;  //循环变量
  102. LPBYTE  temp=new BYTE[wide*height];    //新图像缓冲区
  103. //初始化新分配的内存为255
  104. memset(temp,255,wide*height);
  105. //进行每个像素的减运算
  106. for(j=1;j<height-1;j++)
  107. {
  108. for(i=1;i<wide-1;i++)
  109. {
  110. //获得原像素指针
  111. lpSrc=p_data+wide*j+i;
  112. //获得目标像素指针
  113. lpDst=temp+wide*j+i;
  114. //获得背景像素指针
  115. lpSrcBK=p_dataBK+wide*j+i;
  116. //进行减运算
  117. if((*lpSrc-*lpSrcBK)<0)
  118. *lpDst=0;
  119. else
  120. *lpDst=(*lpSrc-*lpSrcBK);
  121. }
  122. }
  123. memcpy(p_data, temp,wide*height);   //复制处理后的图像
  124. delete  temp;
  125. }
  126. else//24位真彩色
  127. {
  128. int wide,height,DibWidth;    //原图长、宽
  129. p_data=this->GetData ();   //取得原图的数据区指针
  130. wide=this->GetWidth ();  //取得原图的数据区宽度
  131. height=this->GetHeight ();   //取得原图的数据区高度
  132. DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
  133. BYTE *p_temp=new BYTE[height*DibWidth];
  134. //进行每个像素的减运算
  135. for(int j=1;j<height-1;j++)
  136. {
  137. for(int i=1;i<DibWidth-1;i++)
  138. {
  139. //获得原像素指针
  140. lpSrc=p_data+DibWidth*j+i;
  141. //获得目标像素指针
  142. lpDst=p_temp+DibWidth*j+i;
  143. //获得背景像素指针
  144. lpSrcBK=p_dataBK+DibWidth*j+i;
  145. //进行减运算
  146. if((*lpSrc-*lpSrcBK)<0)
  147. *lpDst=0;
  148. else
  149. *lpDst=(*lpSrc-*lpSrcBK);
  150. }
  151. }
  152. memcpy(p_data, p_temp,DibWidth*height);   //复制处理后的图像
  153. delete  []p_temp;
  154. }
  155. }
  156. ///***************************************************************/           
  157. /*函数名称:Yuyunsuan(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
  158. /*函数类型:void 
  159. /*参数说明:p_data       原图像首地址
  160. /*          p_dataBK     背景图像首地址
  161. /*          wide,height 原图像的高和宽                                   
  162. /*功能:对图像进行与运算。            
  163. /***************************************************************/
  164. void TuXiangHeChengDib::Yuyunsuan(LPBYTE p_data, LPBYTE p_dataBK, int wide, int height)
  165. {
  166.     if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
  167. {
  168. int i,j;  //循环变量   
  169. LPBYTE  temp1=new BYTE[wide*height]; //新图像缓冲区
  170. LPBYTE  temp2=new BYTE[wide*height]; 
  171. memset( temp1,0,wide*height);
  172. memset( temp2,0,wide*height);
  173. //对原图二值化
  174. for(j=0;j<height;j++)
  175. {
  176. for(i=0;i<wide;i++)
  177. {
  178. if(p_data[wide*j+i]>128)
  179. temp1[wide*j+i]=1; 
  180. }
  181. }
  182. //对背景二值化
  183. for(j=0;j<height;j++)
  184. {
  185. for(i=0;i<wide;i++)
  186. {
  187. if(p_dataBK[wide*j+i]>128)
  188. temp2[wide*j+i]=1; 
  189. }
  190. }
  191. //进行每个像素的与运算
  192. for(j=1;j<height-1;j++)
  193. {
  194. for(i=1;i<wide-1;i++)
  195. {   
  196. if( temp2[wide*j+i]==1&& temp1[wide*j+i]==1)
  197. temp1[wide*j+i]=255;
  198. else 
  199. temp1[wide*j+i]=0;
  200. }
  201. }
  202. memcpy(p_data, temp1,wide*height);   //复制处理后的图像
  203. delete  temp1;
  204. delete  temp2;
  205. }
  206. else//24位真彩色
  207. {
  208. int i,j;  //循环变量
  209. LPBYTE  p_data;     //原图数据区指针
  210. int wide,height,DibWidth;    //原图长、宽
  211. p_data=this->GetData ();   //取得原图的数据区指针
  212. wide=this->GetWidth ();  //取得原图的数据区宽度
  213. height=this->GetHeight ();   //取得原图的数据区高度
  214. DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
  215. BYTE *p_temp1=new BYTE[height*DibWidth];
  216. BYTE *p_temp2=new BYTE[height*DibWidth];
  217. //对原图二值化
  218. for(j=0;j<height;j++)
  219. {
  220. for(i=0;i<DibWidth;i++)
  221. {
  222. if(p_data[DibWidth*j+i]>128)
  223. p_temp1[DibWidth*j+i]=1; 
  224. }
  225. }
  226. //对背景二值化
  227. for(j=0;j<height;j++)
  228. {
  229. for(i=0;i<DibWidth;i++)
  230. {
  231. if(p_dataBK[DibWidth*j+i]>128)
  232. p_temp2[DibWidth*j+i]=1; 
  233. }
  234. }
  235. //进行每个像素的与运算
  236. for(j=1;j<height-1;j++)
  237. {
  238. for(i=1;i<DibWidth-1;i++)
  239. {   
  240. if( p_temp2[DibWidth*j+i]==1&& p_temp1[DibWidth*j+i]==1)
  241. p_temp1[DibWidth*j+i]=255;
  242. else 
  243. p_temp1[DibWidth*j+i]=0;
  244. }
  245. }
  246. memcpy(p_data, p_temp1,DibWidth*height);   //复制处理后的图像
  247. delete  []p_temp1;
  248. delete  []p_temp2;
  249. }
  250. }
  251. ///***************************************************************/           
  252. /*函数名称:Huoyunsuan(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
  253. /*函数类型:void 
  254. /*参数说明:p_data       原图像首地址
  255. /*          p_dataBK     背景图像首地址
  256. /*          wide,height 原图像的高和宽                                   
  257. /*功能:对图像进行或运算。            
  258. /***************************************************************/ 
  259. void TuXiangHeChengDib::Huoyunsuan(LPBYTE p_data, LPBYTE p_dataBK, int wide, int height)
  260. {
  261.     if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
  262. {
  263. int i,j;  //循环变量  
  264. LPBYTE  temp1=new BYTE[wide*height]; //新图像缓冲区
  265. LPBYTE  temp2=new BYTE[wide*height]; 
  266. memset(temp1,0,wide*height);
  267. memset(temp2,0,wide*height);
  268. //对原图二值化
  269. for(j=0;j<height;j++)
  270. {
  271. for(i=0;i<wide;i++)
  272. {
  273. if(p_data[wide*j+i]>128)
  274. temp1[wide*j+i]=1; 
  275. }
  276. }
  277. //对背景二值化
  278. for(j=0;j<height;j++)
  279. {
  280. for(i=0;i<wide;i++)
  281. {
  282. if(p_dataBK[wide*j+i]>128)
  283. temp2[wide*j+i]=1; 
  284. }
  285. }
  286. //进行每个像素的与运算
  287. for(j=1;j<height-1;j++)
  288. {
  289. for(i=1;i<wide-1;i++)
  290. {   
  291. if( temp2[wide*j+i]==0&& temp1[wide*j+i]==0)
  292. temp1[wide*j+i]=0;
  293. else 
  294. temp1[wide*j+i]=255;
  295. }
  296. }
  297. memcpy(p_data, temp1,wide*height);   //复制处理后的图像
  298. delete  temp1;
  299. delete  temp2;
  300. }
  301. else//24位真彩色
  302. {
  303. int i,j;  //循环变量
  304. LPBYTE  p_data;     //原图数据区指针
  305. int wide,height,DibWidth;    //原图长、宽
  306. p_data=this->GetData ();   //取得原图的数据区指针
  307. wide=this->GetWidth ();  //取得原图的数据区宽度
  308. height=this->GetHeight ();   //取得原图的数据区高度
  309. DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
  310. BYTE *p_temp1=new BYTE[height*DibWidth];
  311. BYTE *p_temp2=new BYTE[height*DibWidth];
  312. //对原图二值化
  313. for(j=0;j<height;j++)
  314. {
  315. for(i=0;i<DibWidth;i++)
  316. {
  317. if(p_data[DibWidth*j+i]>128)
  318. p_temp1[DibWidth*j+i]=1; 
  319. }
  320. }
  321. //对背景二值化
  322. for(j=0;j<height;j++)
  323. {
  324. for(i=0;i<DibWidth;i++)
  325. {
  326. if(p_dataBK[DibWidth*j+i]>128)
  327. p_temp2[DibWidth*j+i]=1; 
  328. }
  329. }
  330. //进行每个像素的与运算
  331. for(j=1;j<height-1;j++)
  332. {
  333. for(i=1;i<DibWidth-1;i++)
  334. {   
  335. if( p_temp2[DibWidth*j+i]==0&& p_temp1[DibWidth*j+i]==0)
  336. p_temp1[DibWidth*j+i]=0;
  337. else 
  338. p_temp1[DibWidth*j+i]=255;
  339. }
  340. }
  341.         memcpy(p_data, p_temp1,DibWidth*height);   //复制处理后的图像
  342. delete  []p_temp1;
  343. delete  []p_temp2;
  344. }
  345. }
  346. ///***************************************************************/           
  347. /*函数名称:Feiyunsuan()                                        
  348. /*函数类型:void                                   
  349. /*功能:对图像进行非运算。            
  350. /***************************************************************/ 
  351. void TuXiangHeChengDib::Feiyunsuan()
  352. {
  353. int i,j;  //循环变量
  354. BYTE* p_data;//图像指针
  355. int wide,height;  //原图的高和宽
  356. p_data=GetData();
  357.     if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像     
  358.    wide=GetWidth();
  359. else//24位真彩色
  360.    wide=GetDibWidthBytes();
  361. height=GetHeight();
  362. LPBYTE p_temp1=new BYTE[wide*height]; //新图像缓冲区         
  363. memset(p_temp1,0,wide*height); //初始化为0
  364. //对原图二值化
  365. for(j=0;j<height;j++)
  366. {
  367. for(i=0;i<wide;i++)
  368. {
  369. if(p_data[wide*j+i]>128)
  370. p_temp1[wide*j+i]=1; 
  371. }
  372. }
  373.  
  374. //进行每个像素的与运算
  375.     for(j=1;j<height-1;j++)
  376. {
  377. for(i=1;i<wide-1;i++)
  378. {   
  379. if(p_temp1[wide*j+i]==0 )
  380.  p_temp1[wide*j+i]=255;
  381. else 
  382.  p_temp1[wide*j+i]=0;
  383. }
  384. }
  385.     memcpy(p_data,p_temp1,wide*height);   //复制处理后的图像
  386. delete p_temp1;
  387. }
  388. ///***************************************************************/           
  389. /*函数名称:Huofei(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
  390. /*函数类型:void 
  391. /*参数说明:p_data       原图像首地址
  392. /*          p_dataBK     背景图像首地址
  393. /*          wide,height 原图像的高和宽                                   
  394. /*功能:对图像进行或非运算。            
  395. /***************************************************************/ 
  396. void TuXiangHeChengDib::Huofei(LPBYTE p_data, LPBYTE p_dataBK, int wide, int height)
  397. {
  398. if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
  399. {
  400. int i,j;  //循环变量  
  401. LPBYTE  temp1=new BYTE[wide*height]; //新图像缓冲区
  402. LPBYTE  temp2=new BYTE[wide*height]; 
  403. memset( temp1,0,wide*height);
  404. memset( temp2,0,wide*height);
  405. //对原图二值化
  406. for(j=0;j<height;j++)
  407. {
  408. for(i=0;i<wide;i++)
  409. {
  410. if(p_data[wide*j+i]>128)
  411. temp1[wide*j+i]=1; 
  412. }
  413. }
  414. //对背景二值化
  415. for(j=0;j<height;j++)
  416. {
  417. for(i=0;i<wide;i++)
  418. {
  419. if(p_dataBK[wide*j+i]>128)
  420. temp2[wide*j+i]=1; 
  421. }
  422. }
  423. //进行每个像素的与运算
  424. for(j=1;j<height-1;j++)
  425. {
  426. for(i=1;i<wide-1;i++)
  427. {   
  428. if( temp2[wide*j+i]==0&& temp1[wide*j+i]==0)
  429. temp1[wide*j+i]=255;
  430. else 
  431. temp1[wide*j+i]=0;
  432. }
  433. }
  434. memcpy(p_data, temp1,wide*height);   //复制处理后的图像
  435. delete  temp1;
  436. delete  temp2;
  437. }
  438. else//24位真彩色
  439. {
  440. int i,j;  //循环变量
  441. LPBYTE  p_data;     //原图数据区指针
  442. int wide,height,DibWidth;    //原图长、宽
  443. p_data=this->GetData ();   //取得原图的数据区指针
  444. wide=this->GetWidth ();  //取得原图的数据区宽度
  445. height=this->GetHeight ();   //取得原图的数据区高度
  446. DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
  447. BYTE *p_temp1=new BYTE[height*DibWidth];
  448. BYTE *p_temp2=new BYTE[height*DibWidth];
  449. //对原图二值化
  450. for(j=0;j<height;j++)
  451. {
  452. for(i=0;i<DibWidth;i++)
  453. {
  454. if(p_data[DibWidth*j+i]>128)
  455. p_temp1[DibWidth*j+i]=1; 
  456. }
  457. }
  458. //对背景二值化
  459. for(j=0;j<height;j++)
  460. {
  461. for(i=0;i<DibWidth;i++)
  462. {
  463. if(p_dataBK[DibWidth*j+i]>128)
  464. p_temp2[DibWidth*j+i]=1; 
  465. }
  466. }
  467. //进行每个像素的与运算
  468. for(j=1;j<height-1;j++)
  469. {
  470. for(i=3;i<DibWidth-3;i++)
  471. {   
  472. if( p_temp2[DibWidth*j+i]==0&& p_temp1[DibWidth*j+i]==0)
  473. p_temp1[DibWidth*j+i]=255;
  474. else 
  475. p_temp1[DibWidth*j+i]=0;
  476. }
  477. }
  478. memcpy(p_data, p_temp1,DibWidth*height);   //复制处理后的图像
  479. delete  []p_temp1;
  480. delete  []p_temp2;
  481. }
  482. }
  483. ///***************************************************************/           
  484. /*函数名称:Yufei(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
  485. /*函数类型:void 
  486. /*参数说明:p_data       原图像首地址
  487. /*          p_dataBK     背景图像首地址
  488. /*          wide,height 原图像的高和宽                                   
  489. /*功能:对图像进行与非运算。            
  490. /***************************************************************/
  491. void TuXiangHeChengDib::Yufei(LPBYTE p_data, LPBYTE p_dataBK, int wide, int height)
  492. {
  493. if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
  494. {
  495. int i,j;  //循环变量  
  496. PBYTE  temp1=new BYTE[wide*height]; //新图像缓冲区
  497. LPBYTE  temp2=new BYTE[wide*height]; 
  498. memset( temp1,0,wide*height);
  499. memset( temp2,0,wide*height);
  500. //对原图二值化
  501. for(j=0;j<height;j++)
  502. {
  503. for(i=0;i<wide;i++)
  504. {
  505. if(p_data[wide*j+i]>128)
  506. temp1[wide*j+i]=1; 
  507. }
  508. }
  509. //对背景二值化
  510. for(j=0;j<height;j++)
  511. {
  512. for(i=0;i<wide;i++)
  513. {
  514. if(p_dataBK[wide*j+i]>128)
  515. temp2[wide*j+i]=1; 
  516. }
  517. }
  518. //进行每个像素的与非运算
  519. for(j=1;j<height-1;j++)
  520. {
  521. for(i=1;i<wide-1;i++)
  522. {   
  523. if( temp2[wide*j+i]==1&& temp1[wide*j+i]==1)
  524. temp1[wide*j+i]=0;
  525. else 
  526. temp1[wide*j+i]=255;
  527. }
  528. }
  529. memcpy(p_data, temp1,wide*height);   //复制处理后的图像
  530. delete  temp1;
  531. delete  temp2;
  532. }
  533. else//24位真彩色
  534. {
  535. int i,j;  //循环变量
  536. LPBYTE  p_data;     //原图数据区指针
  537. int wide,height,DibWidth;    //原图长、宽
  538. p_data=this->GetData ();   //取得原图的数据区指针
  539. wide=this->GetWidth ();  //取得原图的数据区宽度
  540. height=this->GetHeight ();   //取得原图的数据区高度
  541. DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
  542. BYTE *p_temp1=new BYTE[height*DibWidth];
  543. BYTE *p_temp2=new BYTE[height*DibWidth];
  544. //对原图二值化
  545. for(j=0;j<height;j++)
  546. {
  547. for(i=0;i<DibWidth;i++)
  548. {
  549. if(p_data[DibWidth*j+i]>128)
  550. p_temp1[DibWidth*j+i]=1; 
  551. }
  552. }
  553. //对背景二值化
  554. for(j=0;j<height;j++)
  555. {
  556. for(i=0;i<DibWidth;i++)
  557. {
  558. if(p_dataBK[DibWidth*j+i]>128)
  559. p_temp2[DibWidth*j+i]=1; 
  560. }
  561. }
  562. //进行每个像素的与非运算
  563. for(j=1;j<height-1;j++)
  564. {
  565. for(i=3;i<DibWidth-3;i++)
  566. {   
  567. if( p_temp2[wide*j+i]==1&& p_temp1[DibWidth*j+i]==1)
  568. p_temp1[DibWidth*j+i]=0;
  569. else 
  570. p_temp1[DibWidth*j+i]=255;
  571. }
  572. }
  573. memcpy(p_data, p_temp1,DibWidth*height);   //复制处理后的图像
  574. delete  []p_temp1;
  575. delete  []p_temp2;
  576. }
  577. }
  578. ///***************************************************************/           
  579. /*函数名称:Yihuo(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
  580. /*函数类型:void 
  581. /*参数说明:p_data       原图像首地址
  582. /*          p_dataBK     背景图像首地址
  583. /*          wide,height 原图像的高和宽                                   
  584. /*功能:对图像进行异或运算。            
  585. /***************************************************************/
  586. void TuXiangHeChengDib::Yihuo(LPBYTE p_data, LPBYTE p_dataBK, int wide, int height)
  587. {
  588. if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
  589. {
  590.        int i,j;  //循环变量 
  591.    LPBYTE  temp1=new BYTE[wide*height]; //新图像缓冲区
  592.        LPBYTE  temp2=new BYTE[wide*height]; 
  593.    memset( temp1,0,wide*height);
  594.        memset( temp2,0,wide*height);
  595.    //对原图二值化
  596.    for(j=0;j<height;j++)
  597.    {
  598. for(i=0;i<wide;i++)
  599. {
  600. if(p_data[wide*j+i]>128)
  601.  temp1[wide*j+i]=1; 
  602. }
  603. }
  604. //对背景二值化
  605. for(j=0;j<height;j++)
  606. {
  607. for(i=0;i<wide;i++)
  608. {
  609. if(p_dataBK[wide*j+i]>128)
  610.    temp2[wide*j+i]=1; 
  611. }
  612. }
  613. //进行每个像素的异或运算
  614.         for(j=1;j<height-1;j++)
  615. {
  616. for(i=1;i<wide-1;i++)
  617. {   
  618. if( temp2[wide*j+i]+ temp1[wide*j+i]==1)
  619.   temp1[wide*j+i]=255;
  620. else 
  621.   temp1[wide*j+i]=0;
  622. }
  623. }
  624.         memcpy(p_data, temp1,wide*height);   //复制处理后的图像
  625. delete  temp1;
  626. delete  temp2;
  627. }
  628. else//24位真彩色
  629. {
  630.         int i,j;  //循环变量
  631.     LPBYTE  p_data;     //原图数据区指针
  632.     int wide,height,DibWidth;    //原图长、宽
  633.     p_data=this->GetData ();   //取得原图的数据区指针
  634.         wide=this->GetWidth ();  //取得原图的数据区宽度
  635.         height=this->GetHeight ();   //取得原图的数据区高度
  636.     DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
  637.     BYTE *p_temp1=new BYTE[height*DibWidth];
  638.     BYTE *p_temp2=new BYTE[height*DibWidth];
  639. //对原图二值化
  640. for(j=0;j<height;j++)
  641. {
  642. for(i=0;i<DibWidth;i++)
  643. {
  644. if(p_data[DibWidth*j+i]>128)
  645.  p_temp1[DibWidth*j+i]=1; 
  646. }
  647. }
  648. //对背景二值化
  649. for(j=0;j<height;j++)
  650. {
  651. for(i=0;i<DibWidth;i++)
  652. {
  653. if(p_dataBK[DibWidth*j+i]>128)
  654.    p_temp2[DibWidth*j+i]=1; 
  655. }
  656. }
  657. //进行每个像素的异或运算
  658.         for(j=1;j<height-1;j++)
  659. {
  660. for(i=3;i<DibWidth-3;i++)
  661. {   
  662. if( p_temp2[DibWidth*j+i]+ p_temp1[DibWidth*j+i]==1)
  663. p_temp1[DibWidth*j+i]=255;
  664. else 
  665. p_temp1[DibWidth*j+i]=0;
  666. }
  667. }
  668.         memcpy(p_data, p_temp1,DibWidth*height);   //复制处理后的图像
  669. delete  []p_temp1;
  670. delete  []p_temp2;
  671. }
  672. }