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