EdgeEnhance.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:7k
源码类别:

图形图象

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "EdgeEnhance.h"
  3. #include "Convolute.h"
  4. #include "ConvoluteKernel.h"
  5. #include "math.h"
  6. #define MAX( a, b ) ( a > b ? a : b )
  7. BOOL _fnCOM_Convolute(LPIMAGEPROCSTR lpInfo,int nKernel,int nStrength,KERNEL* kernel)
  8. {
  9. // CopyMemory(lpInfo->_pdbdata ,lpInfo->_psbdata ,lpInfo->sImageInfo.width*lpInfo->sImageInfo.height*(lpInfo->sImageInfo.bitperpix/8));
  10. WORD skip=lpInfo->sImageInfo .byteperline ;
  11. UINT i,j;
  12. for(i=1;i<(UINT)lpInfo->sImageInfo.height-1;i++)
  13. {
  14. for(j=1;j<(UINT)lpInfo->sImageInfo.width-1;j++)
  15. {
  16. int red=0,green=0,blue=0;
  17. for(int k=0;k<nKernel;++k)
  18. {
  19. int r=0,g=0,b=0;
  20. _fnSPE_Convolute(&r,&g,&b,i,j,skip,lpInfo->_psbdata,kernel+k);
  21. if(r>red)
  22. red=r;
  23. if(g>green)
  24. green=g;
  25. if(b>blue)
  26. blue=b;
  27. }
  28. LONG lOffset=(LONG)(i*skip)+(LONG)(j*4);
  29. if(nStrength!=100)
  30. {
  31. BYTE Oldb=*(lpInfo->_psbdata+lOffset++);
  32. BYTE Oldg=*(lpInfo->_psbdata+lOffset++);
  33. BYTE Oldr=*(lpInfo->_psbdata+lOffset);
  34. red=Oldr+(((red-Oldr)*nStrength)/100);
  35. green=Oldg+(((green-Oldg)*nStrength)/100);
  36. blue=Oldb+(((blue-Oldb)*nStrength)/100);
  37. lOffset=(LONG)(i*skip)+(LONG)(j*4);
  38. }
  39. *(lpInfo->_pdbdata+lOffset++)=(BYTE)((blue)<(0)?(0):((blue)>(255)?(255):(blue)));
  40. *(lpInfo->_pdbdata+lOffset++)=(BYTE)((green)<(0)?(0):((green)>(255)?(255):(green)));
  41. *(lpInfo->_pdbdata+lOffset)=(BYTE)((red)<(0)?(0):((red)>(255)?(255):(red)));
  42. }
  43. }
  44. return PROCERR_SUCCESS;
  45. }
  46. BOOL _fnCOM_Edge(LPIMAGEPROCSTR lpInfo,int nStrength,BOOL Algorith)
  47. {
  48. // CopyMemory(lpInfo->_pdbdata ,lpInfo->_psbdata ,lpInfo->sImageInfo.width*lpInfo->sImageInfo.height*(lpInfo->sImageInfo.bitperpix/8));
  49. WORD skip=lpInfo->sImageInfo .byteperline ;
  50. UINT i,j;
  51. for(i=1;i<(UINT)lpInfo->sImageInfo.height-1;i++)
  52. {
  53. for(j=1;j<(UINT)lpInfo->sImageInfo.width-1;j++)
  54. {
  55. int red=0,green=0,blue=0;
  56. _fnSPE_Edge(&red,&green,&blue,i,j,skip,lpInfo->_psbdata,nStrength,Algorith);
  57. LONG lOffset=(LONG)(i*skip)+(LONG)(j*4);
  58. *(lpInfo->_pdbdata+lOffset++)=(BYTE)((blue)<(0)?(0):((blue)>(255)?(255):(blue)));
  59. *(lpInfo->_pdbdata+lOffset++)=(BYTE)((green)<(0)?(0):((green)>(255)?(255):(green)));
  60. *(lpInfo->_pdbdata+lOffset)=(BYTE)((red)<(0)?(0):((red)>(255)?(255):(red)));
  61. }
  62. }
  63. return PROCERR_SUCCESS;
  64. }
  65. void _fnSPE_Edge(int *red,int *green,int *blue,int i,int j,
  66. WORD wBytesPerLine,LPBYTE lpData,
  67. int nStrength,BOOL bAlgorithm)
  68. {
  69. BYTE b[9],g[9],r[9];
  70. LONG lOffset;
  71. DWORD dwLineAEIAveBelow, dwLineAEIAveAbove, dwLineAEIMaxDif;
  72. DWORD dwLineBEHAveBelow, dwLineBEHAveAbove, dwLineBEHMaxDif;
  73. DWORD dwLineCEGAveBelow, dwLineCEGAveAbove, dwLineCEGMaxDif;
  74. DWORD dwLineDEFAveBelow, dwLineDEFAveAbove, dwLineDEFMaxDif;
  75. DWORD dwMaxDif;
  76. DWORD  dwTemp, dwGrayList[9];
  77. lOffset=(LONG)(i-1)*(LONG)wBytesPerLine+(LONG)((j-1)*4);
  78. b[0]=*(lpData+lOffset++);
  79. g[0]=*(lpData+lOffset++);
  80. r[0]=*(lpData+lOffset);
  81. lOffset=(LONG)(i-1)*(LONG)wBytesPerLine+(LONG)((j)*4);
  82. b[1]=*(lpData+lOffset++);
  83. g[1]=*(lpData+lOffset++);
  84. r[1]=*(lpData+lOffset);
  85. lOffset=(LONG)(i-1)*(LONG)wBytesPerLine+(LONG)((j+1)*4);
  86. b[2]=*(lpData+lOffset++);
  87. g[2]=*(lpData+lOffset++);
  88. r[2]=*(lpData+lOffset);
  89. lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j-1)*4);
  90. b[3]=*(lpData+lOffset++);
  91. g[3]=*(lpData+lOffset++);
  92. r[3]=*(lpData+lOffset);
  93. lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j)*4);
  94. b[4]=*(lpData+lOffset++);
  95. g[4]=*(lpData+lOffset++);
  96. r[4]=*(lpData+lOffset);
  97. lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j+1)*4);
  98. b[5]=*(lpData+lOffset++);
  99. g[5]=*(lpData+lOffset++);
  100. r[5]=*(lpData+lOffset);
  101. lOffset=(LONG)(i+1)*(LONG)wBytesPerLine+(LONG)((j-1)*4);
  102. b[6]=*(lpData+lOffset++);
  103. g[6]=*(lpData+lOffset++);
  104. r[6]=*(lpData+lOffset);
  105. lOffset=(LONG)(i+1)*(LONG)wBytesPerLine+(LONG)((j)*4);
  106. b[7]=*(lpData+lOffset++);
  107. g[7]=*(lpData+lOffset++);
  108. r[7]=*(lpData+lOffset);
  109. lOffset=(LONG)(i+1)*(LONG)wBytesPerLine+(LONG)((j+1)*4);
  110. b[8]=*(lpData+lOffset++);
  111. g[8]=*(lpData+lOffset++);
  112. r[8]=*(lpData+lOffset);
  113. for(int k=0;k<9;k++)
  114. {
  115. dwGrayList[k]=(r[k]*30+g[k]*59+b[k]*11)/100;
  116. }
  117. dwLineAEIAveBelow = ( dwGrayList[3] + dwGrayList[6] + dwGrayList[7] ) / 3;
  118. dwLineAEIAveAbove = ( dwGrayList[1] + dwGrayList[2] + dwGrayList[5] ) / 3;
  119. if( dwLineAEIAveBelow > dwLineAEIAveAbove )
  120. dwLineAEIMaxDif = dwLineAEIAveBelow - dwLineAEIAveAbove;
  121. else 
  122. dwLineAEIMaxDif = dwLineAEIAveAbove - dwLineAEIAveBelow;
  123. dwLineBEHAveBelow = ( dwGrayList[0] + dwGrayList[3] + dwGrayList[6] ) / 3;
  124. dwLineBEHAveAbove = ( dwGrayList[2] + dwGrayList[5] + dwGrayList[8] ) / 3;
  125. if( dwLineBEHAveBelow > dwLineBEHAveAbove )
  126. dwLineBEHMaxDif = dwLineBEHAveBelow - dwLineBEHAveAbove;
  127. else
  128. dwLineBEHMaxDif = dwLineBEHAveAbove - dwLineBEHAveBelow;
  129. dwLineCEGAveBelow = ( dwGrayList[5] + dwGrayList[7] + dwGrayList[8] ) / 3;
  130. dwLineCEGAveAbove = ( dwGrayList[0] + dwGrayList[1] + dwGrayList[3] ) / 3;
  131. if( dwLineCEGAveBelow > dwLineCEGAveAbove ) 
  132. dwLineCEGMaxDif = dwLineCEGAveBelow - dwLineCEGAveAbove;
  133. else 
  134. dwLineCEGMaxDif = dwLineCEGAveAbove - dwLineCEGAveBelow;
  135. dwLineDEFAveBelow = ( dwGrayList[6] + dwGrayList[7] + dwGrayList[8] ) / 3;
  136. dwLineDEFAveAbove = ( dwGrayList[0] + dwGrayList[1] + dwGrayList[2] ) / 3;
  137. if( dwLineDEFAveBelow > dwLineDEFAveAbove )
  138. dwLineDEFMaxDif = dwLineDEFAveBelow - dwLineDEFAveAbove;
  139. else 
  140. dwLineDEFMaxDif = dwLineDEFAveAbove - dwLineDEFAveBelow;
  141. dwMaxDif = MAX( dwLineAEIMaxDif, dwLineBEHMaxDif );
  142. dwMaxDif = MAX( dwLineCEGMaxDif, dwMaxDif );
  143. dwMaxDif = MAX( dwLineDEFMaxDif, dwMaxDif );
  144. lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j)*4);
  145. if(bAlgorithm==TRUE)
  146. {
  147. if( dwMaxDif >(UINT)nStrength )
  148. {
  149. dwTemp = ( ( *(lpData+lOffset++) * 15) / 10 );
  150. if( dwTemp > 255 )
  151. dwTemp = 255;
  152. *blue = (unsigned char) dwTemp;
  153. dwTemp = ( ( *(lpData+lOffset++) * 15) / 10 );
  154. if( dwTemp > 255 ) 
  155. dwTemp = 255;
  156. *green = (unsigned char) dwTemp;
  157. dwTemp = ( ( *(lpData+lOffset) * 15) / 10 );
  158. if( dwTemp > 255 ) 
  159. dwTemp = 255;
  160. *red = (unsigned char) dwTemp;
  161. }
  162. else
  163. {
  164. *blue = *(lpData+lOffset++);
  165. *green = *(lpData+lOffset++);
  166. *red = *(lpData+lOffset);
  167. }
  168. }
  169. else
  170. {
  171. if( dwMaxDif >(UINT)nStrength )
  172. {
  173. dwTemp =0;
  174. if( dwTemp > 255 )
  175. dwTemp = 255;
  176. *blue = (unsigned char) dwTemp;
  177. dwTemp = 0;
  178. if( dwTemp > 255 ) 
  179. dwTemp = 255;
  180. *green = (unsigned char) dwTemp;
  181. dwTemp = 0;
  182. if( dwTemp > 255 ) 
  183. dwTemp = 255;
  184. *red = (unsigned char) dwTemp;
  185. }
  186. else
  187. {
  188. *blue = 255;
  189. *green = 255;
  190. *red = 255;
  191. }
  192. }
  193. }