Imagepointprocesses.cpp
上传用户:alisonmail
上传日期:2013-02-28
资源大小:500k
文件大小:44k
源码类别:

图片显示

开发平台:

Visual C++

  1. // ImagePointProcesses.cpp
  2. #include "stdafx.h"
  3. #include "ImagePointProcesses.h"
  4. #include "fft.cpp"
  5. #include "winbase.h"
  6. #include "edgecontour.h"
  7. /**************************************************************************
  8. *                                                                         *
  9. *                               Point Processes                           *
  10. *                                                                         *
  11. **************************************************************************/
  12. CImagePointProcesses::CImagePointProcesses()
  13. {
  14. EdgeDetectType = SOBEL;
  15. Embossed = FALSE;
  16. }
  17. CImagePointProcesses::CImagePointProcesses( CImageObject *pImageObject )
  18. {
  19. m_pImageObject = pImageObject;
  20. EdgeDetectType = SOBEL;
  21. Embossed = FALSE;
  22. }
  23. BOOL CImagePointProcesses::ChangeBrightness( int nBrightness, int nX1, int nY1, int nX2, int nY2, CImageObject *pImageObject )
  24. {
  25. if( pImageObject != NULL ) m_pImageObject = pImageObject;
  26. if( m_pImageObject == NULL ) return( FALSE );
  27. if( m_pImageObject->GetNumBits() == 1 ) return( FALSE );
  28. if( nBrightness == 100 ) return( TRUE );
  29. BOOL bLessThanHalf, bCompleteImage;
  30. m_pImageObject->NormalizeCoordinates( &nX1, &nY1, &nX2, &nY2, &bCompleteImage, &bLessThanHalf );
  31. unsigned char *pBuffer, *pBits, *pTemp;
  32. BITMAPINFOHEADER *pBIH;
  33. RGBQUAD *pPalette;
  34. int nWidthBytes, nNumColors, x, y, i;
  35. pBuffer = (unsigned char *) m_pImageObject->GetDIBPointer( &nWidthBytes, m_pImageObject->GetNumBits() );
  36. if( pBuffer == NULL ) return( FALSE );
  37. pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
  38. nNumColors = m_pImageObject->GetNumColors();
  39. pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
  40. pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
  41. if( nBrightness < 0 ) nBrightness = 0;
  42. else if( nBrightness > 200 ) nBrightness = 200;
  43. LOGPALETTE *pLogPal;
  44. CPalette *_pPalette = m_pImageObject->GetPalette();
  45. if( m_pImageObject->GetNumBits() > 8 && ( pLogPal = m_pImageObject->GetLogPal() ) != NULL && ( bCompleteImage || !bLessThanHalf ) ){
  46. _pPalette->DeleteObject();
  47. for( i=0; i<nNumColors; i++ )
  48. BrightnessValues( nBrightness,
  49. pLogPal->palPalEntry[i].peRed,
  50. pLogPal->palPalEntry[i].peGreen,
  51. pLogPal->palPalEntry[i].peBlue,
  52. &pLogPal->palPalEntry[i].peRed,
  53. &pLogPal->palPalEntry[i].peGreen,
  54. &pLogPal->palPalEntry[i].peBlue );
  55. _pPalette->CreatePalette( pLogPal );
  56. }
  57. switch( m_pImageObject->GetNumBits() ){
  58. case 4:
  59. if( bCompleteImage ){
  60. _pPalette->DeleteObject();
  61. for( i=0; i<nNumColors; i++ ) BrightnessValues( nBrightness, pPalette[i].rgbRed, pPalette[i].rgbGreen, pPalette[i].rgbBlue, &pPalette[i].rgbRed, &pPalette[i].rgbGreen, &pPalette[i].rgbBlue );
  62. {
  63. LOGPALETTE *pLogPal = m_pImageObject->CreateLogPalette( pPalette, nNumColors );
  64. if( pLogPal != NULL ){
  65. _pPalette->CreatePalette( pLogPal );
  66. delete [] pLogPal;
  67. }
  68. }
  69. }
  70. else{
  71. unsigned char ucRed, ucGreen, ucBlue, Data;
  72. for( y=nY1; y<=nY2; y++ ){
  73. pTemp = pBits;
  74. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 / 2 ) );
  75. for( x=nX1; x<=nX2; x++ ){
  76. Data = *pTemp;
  77. if( !( x & 1 ) ) Data >>= 4;
  78. else Data &= 0x0f;
  79. ucRed = pPalette[Data].rgbRed;
  80. ucGreen = pPalette[Data].rgbGreen;
  81. ucBlue = pPalette[Data].rgbBlue;
  82. BrightnessValues( nBrightness, ucRed, ucGreen, ucBlue, &ucRed, &ucGreen, &ucBlue );
  83. Data = (unsigned char) m_pImageObject->GetNearestIndex( ucRed, ucGreen, ucBlue, pPalette, nNumColors );
  84. if( !( x & 1 ) ){
  85. Data <<= 4;
  86. (*pTemp) &= 0x0f;
  87. (*pTemp) |= Data;
  88. }
  89. else{
  90. (*pTemp) &= 0xf0;
  91. (*pTemp) |= Data;
  92. pTemp++;
  93. }
  94. }
  95. }
  96. }
  97. break;
  98. case 8:
  99. if( bCompleteImage ){
  100. _pPalette->DeleteObject();
  101. for( i=0; i<nNumColors; i++ ) BrightnessValues( nBrightness, pPalette[i].rgbRed, pPalette[i].rgbGreen, pPalette[i].rgbBlue, &pPalette[i].rgbRed, &pPalette[i].rgbGreen, &pPalette[i].rgbBlue );
  102. {
  103. LOGPALETTE *pLogPal = m_pImageObject->CreateLogPalette( pPalette, nNumColors );
  104. if( pLogPal != NULL ){
  105. _pPalette->CreatePalette( pLogPal );
  106. delete [] pLogPal;
  107. }
  108. }
  109. }
  110. else{
  111. unsigned char ucRed, ucGreen, ucBlue, Data;
  112. for( y=nY1; y<=nY2; y++ ){
  113. pTemp = pBits;
  114. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + nX1 );
  115. for( x=nX1; x<=nX2; x++ ){
  116. Data = *pTemp;
  117. ucRed = pPalette[Data].rgbRed;
  118. ucGreen = pPalette[Data].rgbGreen;
  119. ucBlue = pPalette[Data].rgbBlue;
  120. BrightnessValues( nBrightness, ucRed, ucGreen, ucBlue, &ucRed, &ucGreen, &ucBlue );
  121. Data = (unsigned char) m_pImageObject->GetNearestIndex( ucRed, ucGreen, ucBlue, pPalette, nNumColors );
  122. *pTemp++ = Data;
  123. }
  124. }
  125. }
  126. break;
  127. case 16:
  128. for( y=nY1; y<=nY2; y++ ){
  129. pTemp = pBits;
  130. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 * 2 ) );
  131. for( x=nX1; x<=nX2; x++ ){
  132. }
  133. }
  134. break;
  135. case 24:
  136. for( y=nY1; y<=nY2; y++ ){
  137. pTemp = pBits;
  138. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 * 3 ) );
  139. for( x=nX1; x<=nX2; x++ ){
  140. BrightnessValues( nBrightness, pTemp[0], pTemp[1], pTemp[2], &pTemp[0], &pTemp[1], &pTemp[2] );
  141. pTemp += 3;
  142. }
  143. }
  144. break;
  145. case 32:
  146. for( y=nY1; y<=nY2; y++ ){
  147. unsigned char ucRed, ucGreen, ucBlue;
  148. pTemp = pBits;
  149. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 * 4 ) );
  150. for( x=nX1; x<=nX2; x++ ){
  151. ucRed = pTemp[0];
  152. ucGreen = pTemp[1];
  153. ucBlue = pTemp[2];
  154. *pTemp++ = ucRed;
  155. *pTemp++ = ucGreen;
  156. *pTemp++ = ucBlue;
  157. pTemp++;
  158. }
  159. }
  160. break;
  161. }
  162. ::GlobalUnlock( m_pImageObject->GetDib() );
  163. m_pImageObject->m_nLastError = IMAGELIB_SUCCESS;
  164. return( TRUE );
  165. }
  166. void CImagePointProcesses::BrightnessValues( int nBrightness, unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue, unsigned char *pucNewRed, unsigned char *pucNewGreen, unsigned char *pucNewBlue )
  167. {
  168. if( m_pImageObject == NULL ) return;
  169. DWORD Red, Green, Blue;
  170. Red = (DWORD) ( ( (DWORD) ucRed * (DWORD) nBrightness ) / (DWORD) 100 );
  171. if( Red > 255 ) Red = 255;
  172. else if( Red == 0 && nBrightness > 100 ) Red = (DWORD) ( ( nBrightness * 255 ) / 100 );
  173. ucRed = (unsigned char) Red;
  174. Green = (DWORD) ( ( (DWORD) ucGreen * (DWORD) nBrightness ) / (DWORD) 100 );
  175. if( Green > 255 ) Green = 255;
  176. else if( Green == 0 && nBrightness > 100 ) Green = (DWORD) ( ( nBrightness * 255 ) / 100 );
  177. ucGreen = (unsigned char) Green;
  178. Blue = (DWORD) ( ( (DWORD) ucBlue * (DWORD) nBrightness ) / (DWORD) 100 );
  179. if( Blue > 255 ) Blue = 255;
  180. else if( Blue == 0 && nBrightness > 100 ) Blue = (DWORD) ( ( nBrightness * 255 ) / 100 );
  181. ucBlue = (unsigned char) Blue;
  182. *pucNewRed = ucRed;
  183. *pucNewGreen = ucGreen;
  184. *pucNewBlue = ucBlue;
  185. }
  186. BOOL CImagePointProcesses::ReverseColors( int nX1, int nY1, int nX2, int nY2, CImageObject *pImageObject )
  187. {
  188. if( pImageObject != NULL ) m_pImageObject = pImageObject;
  189. if( m_pImageObject == NULL ) return( FALSE );
  190. BOOL bLessThanHalf, bCompleteImage;
  191. m_pImageObject->NormalizeCoordinates( &nX1, &nY1, &nX2, &nY2, &bCompleteImage, &bLessThanHalf );
  192. unsigned char *pBuffer, *pBits, *pTemp;
  193. BITMAPINFOHEADER *pBIH;
  194. RGBQUAD *pPalette;
  195. int nWidthBytes, nNumColors, x, y, i;
  196. pBuffer = (unsigned char *) m_pImageObject->GetDIBPointer( &nWidthBytes, m_pImageObject->GetNumBits() );
  197. if( pBuffer == NULL ) return( FALSE );
  198. pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
  199. nNumColors = m_pImageObject->GetNumColors();
  200. pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
  201. pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
  202. LOGPALETTE *pLogPal = m_pImageObject->GetLogPal();
  203. CPalette *_pPalette = m_pImageObject->GetPalette();
  204. if( m_pImageObject->GetNumBits() > 8 && pLogPal != NULL && ( bCompleteImage || !bLessThanHalf ) ){
  205. _pPalette->DeleteObject();
  206. for( i=0; i<nNumColors; i++ ){
  207. pLogPal->palPalEntry[i].peRed = 255 - pLogPal->palPalEntry[i].peRed;
  208. pLogPal->palPalEntry[i].peGreen = 255 - pLogPal->palPalEntry[i].peGreen;
  209. pLogPal->palPalEntry[i].peBlue = 255 - pLogPal->palPalEntry[i].peBlue;
  210. }
  211. _pPalette->CreatePalette( pLogPal );
  212. }
  213. switch( m_pImageObject->GetNumBits() ){
  214. case 1:
  215. for( y=nY1; y<=nY2; y++ ){
  216. unsigned char Mask;
  217. pTemp = pBits;
  218. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 / 8 ) );
  219. for( x=nX1; x<=nX2; x++ ){
  220. Mask = 0x80 >> ( x & 7 );
  221. if( pTemp[0] & Mask ) pTemp[0] &= ( Mask ^ 0xff );
  222. else pTemp[0] |= Mask;
  223. if( ( x & 7 ) == 7 ) pTemp++;
  224. }
  225. }
  226. break;
  227. case 4:
  228.   if( bCompleteImage ){
  229. _pPalette->DeleteObject();
  230. for( i=0; i<nNumColors; i++ ){
  231. pPalette[i].rgbRed = 255 - pPalette[i].rgbRed;
  232. pPalette[i].rgbGreen = 255 - pPalette[i].rgbGreen;
  233. pPalette[i].rgbBlue = 255 - pPalette[i].rgbBlue;
  234. }
  235. {
  236. LOGPALETTE *pLogPal = m_pImageObject->CreateLogPalette( pPalette, nNumColors );
  237. if( pLogPal != NULL ){
  238. _pPalette->CreatePalette( pLogPal );
  239. delete [] pLogPal;
  240. }
  241. }
  242. }
  243. else{
  244. unsigned char ucRed, ucGreen, ucBlue, Data;
  245. for( y=nY1; y<=nY2; y++ ){
  246. pTemp = pBits;
  247. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 / 2 ) );
  248. for( x=nX1; x<=nX2; x++ ){
  249. Data = *pTemp;
  250. if( !( x & 1 ) ) Data >>= 4;
  251. else Data &= 0x0f;
  252. ucRed = pPalette[Data].rgbRed;
  253. ucGreen = pPalette[Data].rgbGreen;
  254. ucBlue = pPalette[Data].rgbBlue;
  255. ucRed = 255 - ucRed;
  256. ucGreen = 255 - ucGreen;
  257. ucBlue = 255 - ucBlue;
  258. Data = (unsigned char) m_pImageObject->GetNearestIndex( ucRed, ucGreen, ucBlue, pPalette, nNumColors );
  259. if( !( x & 1 ) ){
  260. Data <<= 4;
  261. (*pTemp) &= 0x0f;
  262. (*pTemp) |= Data;
  263. }
  264. else{
  265. (*pTemp) &= 0xf0;
  266. (*pTemp) |= Data;
  267. pTemp++;
  268. }
  269. }
  270. }
  271. }
  272. break;
  273. case 8:
  274. if( bCompleteImage ){
  275. _pPalette->DeleteObject();
  276. for( i=0; i<nNumColors; i++ ){
  277. pPalette[i].rgbRed = 255 - pPalette[i].rgbRed;
  278. pPalette[i].rgbGreen = 255 - pPalette[i].rgbGreen;
  279. pPalette[i].rgbBlue = 255 - pPalette[i].rgbBlue;
  280. }
  281. {
  282. LOGPALETTE *pLogPal = m_pImageObject->CreateLogPalette( pPalette, nNumColors );
  283. if( pLogPal != NULL ){
  284. _pPalette->CreatePalette( pLogPal );
  285. delete [] pLogPal;
  286. }
  287. }
  288. }
  289. else{
  290. unsigned char ucRed, ucGreen, ucBlue, Data;
  291. for( y=nY1; y<=nY2; y++ ){
  292. pTemp = pBits;
  293. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + nX1 );
  294. for( x=nX1; x<=nX2; x++ ){
  295. Data = *pTemp;
  296. ucRed = pPalette[Data].rgbRed;
  297. ucGreen = pPalette[Data].rgbGreen;
  298. ucBlue = pPalette[Data].rgbBlue;
  299. ucRed = 255 - ucRed;
  300. ucGreen = 255 - ucGreen;
  301. ucBlue = 255 - ucBlue;
  302. Data = (unsigned char) m_pImageObject->GetNearestIndex( ucRed, ucGreen, ucBlue, pPalette, nNumColors );
  303. *pTemp++ = Data;
  304. }
  305. }
  306. }
  307. break;
  308. case 16:
  309. for( y=nY1; y<=nY2; y++ ){
  310. pTemp = pBits;
  311. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 * 2 ) );
  312. for( x=nX1; x<=nX2; x++ ){
  313. }
  314. }
  315. break;
  316. case 24:
  317. for( y=nY1; y<=nY2; y++ ){
  318. pTemp = pBits;
  319. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 * 3 ) );
  320. for( x=nX1; x<=nX2; x++ ){
  321. pTemp[0] = 255 - pTemp[0];
  322. pTemp[1] = 255 - pTemp[1];
  323. pTemp[2] = 255 - pTemp[2];
  324. pTemp += 3;
  325. }
  326. }
  327. break;
  328. case 32:
  329. for( y=nY1; y<=nY2; y++ ){
  330. pTemp = pBits;
  331. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 * 4 ) );
  332. for( x=nX1; x<=nX2; x++ ){
  333. pTemp[0] = 255 - pTemp[0];
  334. pTemp[1] = 255 - pTemp[1];
  335. pTemp[2] = 255 - pTemp[2];
  336. pTemp[3] = 255 - pTemp[3];
  337. pTemp += 4;
  338. }
  339. }
  340. break;
  341. }
  342. ::GlobalUnlock( m_pImageObject->GetDib() );
  343. m_pImageObject->m_nLastError = IMAGELIB_SUCCESS;
  344. return( TRUE );
  345. }
  346. BOOL CImagePointProcesses::MakeGray( BOOL bSetPalette, CImageObject *pImageObject )
  347. {
  348. if( pImageObject != NULL ) m_pImageObject = pImageObject;
  349. if( m_pImageObject == NULL ) return( FALSE );
  350. unsigned char *pBuffer, *pBits, *pTemp;
  351. BITMAPINFOHEADER *pBIH;
  352. RGBQUAD *pPalette;
  353. int nWidthBytes, nNumColors, x, y, i;
  354. WORD wColorBits, *pColorBits;
  355. pBuffer = (unsigned char *) m_pImageObject->GetDIBPointer( &nWidthBytes, m_pImageObject->GetNumBits() );
  356. if( pBuffer == NULL ) return( FALSE );
  357. pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
  358. nNumColors = m_pImageObject->GetNumColors();
  359. pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
  360. pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
  361. unsigned char *pLookup;
  362. DWORD dwGray;
  363. switch( m_pImageObject->GetNumBits() ){
  364. case 1:
  365. break;
  366. case 4:
  367. pLookup = new unsigned char [16];
  368. if( pLookup == NULL ) break;
  369. memset( pLookup, 0, 16 );
  370. for( i=0; i<16; i++ ){
  371. dwGray = ( (DWORD) pPalette[i].rgbRed * 30 +
  372. (DWORD) pPalette[i].rgbGreen * 59 +
  373. (DWORD) pPalette[i].rgbBlue * 11 ) / 100;
  374. pLookup[i] = (unsigned char) dwGray;
  375. }
  376. for( i=0; i<16; i++ ){
  377. pPalette[i].rgbRed = pLookup[i];
  378. pPalette[i].rgbGreen = pLookup[i];
  379. pPalette[i].rgbBlue = pLookup[i];
  380. }
  381. delete [] pLookup;
  382. m_pImageObject->ProcessPalette();
  383. if( bSetPalette && m_pImageObject->m_nPaletteBytes > 0 ){
  384. CWindowDC WindowDC( NULL );
  385. m_pImageObject->SetPalette( &WindowDC );
  386. }
  387. break;
  388. case 8:
  389. pLookup = new unsigned char [256];
  390. if( pLookup == NULL ) break;
  391. memset( pLookup, 0, 256 );
  392. for( i=0; i<256; i++ ){
  393. dwGray = ( (DWORD) pPalette[i].rgbRed * 30 +
  394. (DWORD) pPalette[i].rgbGreen * 59 +
  395. (DWORD) pPalette[i].rgbBlue * 11 ) / 100;
  396. pLookup[i] = (unsigned char) dwGray;
  397. }
  398. for( y=0; y<pBIH->biHeight; y++ ){
  399. pTemp = pBits;
  400. pTemp += y * nWidthBytes;
  401. for( x=0; x<pBIH->biWidth; x++ ) pTemp[x] = pLookup[pTemp[x]];
  402. }
  403. delete [] pLookup;
  404. for( i=0; i<256; i++ ){
  405. pPalette[i].rgbRed = i;
  406. pPalette[i].rgbGreen = i;
  407. pPalette[i].rgbBlue = i;
  408. }
  409. m_pImageObject->ProcessPalette();
  410. if( bSetPalette && m_pImageObject->m_nPaletteBytes > 0 ){
  411. CWindowDC WindowDC( NULL );
  412. m_pImageObject->SetPalette( &WindowDC );
  413. }
  414. break;
  415. case 16:
  416. for( y=0; y<pBIH->biHeight; y++ ){
  417. pTemp = pBits;
  418. pTemp += y * nWidthBytes;
  419. for( x=0; x<pBIH->biWidth; x++ ){
  420. pColorBits = (WORD *) pTemp[x*2];
  421. wColorBits = *pColorBits;
  422. dwGray = ( (DWORD) ( ( wColorBits & 0x7c00 ) >> 10 ) * 30 +
  423. (DWORD) ( ( wColorBits & 0x03e0 ) >> 5 ) * 59 +
  424. (DWORD) ( wColorBits & 0x001f ) * 11 ) / 100;
  425. *pColorBits = ( ( (WORD) dwGray << 10 ) | ( (WORD) dwGray << 5 ) | (WORD) dwGray);
  426. }
  427. }
  428. m_pImageObject->ProcessPalette();
  429. if( bSetPalette && m_pImageObject->m_nPaletteBytes > 0 ){
  430. CWindowDC WindowDC( NULL );
  431. m_pImageObject->SetPalette( &WindowDC );
  432. }
  433. break;
  434. case 24:
  435. for( y=0; y<pBIH->biHeight; y++ ){
  436. pTemp = pBits;
  437. pTemp += y * nWidthBytes;
  438. for( x=0; x<pBIH->biWidth; x++ ){
  439. dwGray = ( (DWORD) pTemp[x*3+2] * 30 +
  440. (DWORD) pTemp[x*3+1] * 59 +
  441. (DWORD) pTemp[x*3] * 11 ) / 100;
  442. pTemp[x*3] = (unsigned char) dwGray;
  443. pTemp[x*3+1] = (unsigned char) dwGray;
  444. pTemp[x*3+2] = (unsigned char) dwGray;
  445. }
  446. }
  447. m_pImageObject->ProcessPalette();
  448. if( bSetPalette && m_pImageObject->m_nPaletteBytes > 0 ){
  449. CWindowDC WindowDC( NULL );
  450. m_pImageObject->SetPalette( &WindowDC );
  451. }
  452. break;
  453. case 32:
  454. for( y=0; y<pBIH->biHeight; y++ ){
  455. pTemp = pBits;
  456. pTemp += y * nWidthBytes;
  457. for( x=0; x<pBIH->biWidth; x++ ){
  458. dwGray = ( (DWORD) pTemp[x*4] * 30 +
  459. (DWORD) pTemp[x*4+1] * 59 +
  460. (DWORD) pTemp[x*4+2] * 11 ) / 100;
  461. pTemp[x*4] = (unsigned char) dwGray;
  462. pTemp[x*4+1] = (unsigned char) dwGray;
  463. pTemp[x*4+2] = (unsigned char) dwGray;
  464. }
  465. }
  466. m_pImageObject->ProcessPalette();
  467. if( bSetPalette && m_pImageObject->m_nPaletteBytes > 0 ){
  468. CWindowDC WindowDC( NULL );
  469. m_pImageObject->SetPalette( &WindowDC );
  470. }
  471. break;
  472. }
  473. ::GlobalUnlock( m_pImageObject->GetDib() );
  474. m_pImageObject->m_nLastError = IMAGELIB_SUCCESS;
  475. return( TRUE );
  476. }
  477. BOOL CImagePointProcesses::Colorize( int nX1, int nY1, int nX2, int nY2, COLORREF Color, CImageObject *pImageObject )
  478. {
  479. if( pImageObject != NULL ) m_pImageObject = pImageObject;
  480. if( m_pImageObject == NULL ) return( FALSE );
  481. if( m_pImageObject->GetNumBits() == 1 ) return( FALSE );
  482. BOOL bLessThanHalf, bCompleteImage;
  483. m_pImageObject->NormalizeCoordinates( &nX1, &nY1, &nX2, &nY2, &bCompleteImage, &bLessThanHalf );
  484. unsigned char *pBuffer, *pBits, *pTemp;
  485. BITMAPINFOHEADER *pBIH;
  486. RGBQUAD *pPalette;
  487. int nWidthBytes, nNumColors, x, y, i;
  488. pBuffer = (unsigned char *) m_pImageObject->GetDIBPointer( &nWidthBytes, m_pImageObject->GetNumBits() );
  489. if( pBuffer == NULL ) return( FALSE );
  490. pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
  491. nNumColors = m_pImageObject->GetNumColors();
  492. pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
  493. pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
  494. DWORD dwRed, dwGreen, dwBlue, dwGray;
  495. dwBlue = Color >> 16;
  496. dwGreen = ( Color >> 8 ) & 0x000000ff;
  497. dwRed = Color & 0x000000ff;
  498. LOGPALETTE *pLogPal = m_pImageObject->GetLogPal();
  499. CPalette *_pPalette = m_pImageObject->GetPalette();
  500. if( m_pImageObject->GetNumBits() > 8 && pLogPal != NULL && ( bCompleteImage || !bLessThanHalf ) ){
  501. _pPalette->DeleteObject();
  502. for( i=0; i<nNumColors; i++ ){
  503. dwGray = ( (DWORD) pLogPal->palPalEntry[i].peRed * 30 +
  504. (DWORD) pLogPal->palPalEntry[i].peGreen * 59 +
  505. (DWORD) pLogPal->palPalEntry[i].peBlue * 11 ) / 100;
  506. pLogPal->palPalEntry[i].peRed = (unsigned char) ( ( dwRed * dwGray ) / (DWORD) 255 );
  507. pLogPal->palPalEntry[i].peGreen = (unsigned char) ( ( dwGreen * dwGray ) / (DWORD) 255 );
  508. pLogPal->palPalEntry[i].peBlue = (unsigned char) ( ( dwBlue * dwGray ) / (DWORD) 255 );
  509. }
  510. _pPalette->CreatePalette( pLogPal );
  511. }
  512. switch( m_pImageObject->GetNumBits() ){
  513. case 4:
  514.   if( bCompleteImage ){
  515. _pPalette->DeleteObject();
  516. for( i=0; i<nNumColors; i++ ){
  517. dwGray = ( (DWORD) pPalette[i].rgbRed * 30 +
  518. (DWORD) pPalette[i].rgbGreen * 59 +
  519. (DWORD) pPalette[i].rgbBlue * 11 ) / 100;
  520. pPalette[i].rgbRed = (unsigned char) ( ( dwRed * dwGray ) / (DWORD) 255 );
  521. pPalette[i].rgbGreen = (unsigned char) ( ( dwGreen * dwGray ) / (DWORD) 255 );
  522. pPalette[i].rgbBlue = (unsigned char) ( ( dwBlue * dwGray ) / (DWORD) 255 );
  523. }
  524. {
  525. LOGPALETTE *pLogPal = m_pImageObject->CreateLogPalette( pPalette, nNumColors );
  526. if( pLogPal != NULL ){
  527. _pPalette->CreatePalette( pLogPal );
  528. delete [] pLogPal;
  529. }
  530. }
  531. }
  532. else{
  533. unsigned char ucRed, ucGreen, ucBlue, Data;
  534. for( y=nY1; y<=nY2; y++ ){
  535. pTemp = pBits;
  536. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 / 2 ) );
  537. for( x=nX1; x<=nX2; x++ ){
  538. Data = *pTemp;
  539. if( !( x & 1 ) ) Data >>= 4;
  540. else Data &= 0x0f;
  541. ucRed = pPalette[Data].rgbRed;
  542. ucGreen = pPalette[Data].rgbGreen;
  543. ucBlue = pPalette[Data].rgbBlue;
  544. ucRed = 255 - ucRed;
  545. ucGreen = 255 - ucGreen;
  546. ucBlue = 255 - ucBlue;
  547. Data = (unsigned char) m_pImageObject->GetNearestIndex( ucRed, ucGreen, ucBlue, pPalette, nNumColors );
  548. if( !( x & 1 ) ){
  549. Data <<= 4;
  550. (*pTemp) &= 0x0f;
  551. (*pTemp) |= Data;
  552. }
  553. else{
  554. (*pTemp) &= 0xf0;
  555. (*pTemp) |= Data;
  556. pTemp++;
  557. }
  558. }
  559. }
  560. }
  561. break;
  562. case 8:
  563. if( bCompleteImage ){
  564. _pPalette->DeleteObject();
  565. for( i=0; i<nNumColors; i++ ){
  566. dwGray = ( (DWORD) pPalette[i].rgbRed * 30 +
  567. (DWORD) pPalette[i].rgbGreen * 59 +
  568. (DWORD) pPalette[i].rgbBlue * 11 ) / 100;
  569. pPalette[i].rgbRed = (unsigned char) ( ( dwRed * dwGray ) / (DWORD) 255 );
  570. pPalette[i].rgbGreen = (unsigned char) ( ( dwGreen * dwGray ) / (DWORD) 255 );
  571. pPalette[i].rgbBlue = (unsigned char) ( ( dwBlue * dwGray ) / (DWORD) 255 );
  572. }
  573. {
  574. LOGPALETTE *pLogPal = m_pImageObject->CreateLogPalette( pPalette, nNumColors );
  575. if( pLogPal != NULL ){
  576. _pPalette->CreatePalette( pLogPal );
  577. delete [] pLogPal;
  578. }
  579. }
  580. }
  581. else{
  582. unsigned char ucRed, ucGreen, ucBlue, Data;
  583. for( y=nY1; y<=nY2; y++ ){
  584. pTemp = pBits;
  585. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + nX1 );
  586. for( x=nX1; x<=nX2; x++ ){
  587. Data = *pTemp;
  588. dwGray = ( (DWORD) pPalette[Data].rgbRed * 30 +
  589. (DWORD) pPalette[Data].rgbGreen * 59 +
  590. (DWORD) pPalette[Data].rgbBlue * 11 ) / 100;
  591. ucRed = (unsigned char) ( ( dwRed * dwGray ) / (DWORD) 255 );
  592. ucGreen = (unsigned char) ( ( dwGreen * dwGray ) / (DWORD) 255 );
  593. ucBlue = (unsigned char) ( ( dwBlue * dwGray ) / (DWORD) 255 );
  594. Data = (unsigned char) m_pImageObject->GetNearestIndex( ucRed, ucGreen, ucBlue, pPalette, nNumColors );
  595. *pTemp++ = Data;
  596. }
  597. }
  598. }
  599. break;
  600. case 16:
  601. for( y=nY1; y<=nY2; y++ ){
  602. pTemp = pBits;
  603. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 * 2 ) );
  604. for( x=nX1; x<=nX2; x++ ){
  605. }
  606. }
  607. break;
  608. case 24:
  609. for( y=nY1; y<=nY2; y++ ){
  610. pTemp = pBits;
  611. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 * 3 ) );
  612. for( x=nX1; x<=nX2; x++ ){
  613. dwGray = ( (DWORD) pTemp[2] * 30 +
  614. (DWORD) pTemp[1] * 59 +
  615. (DWORD) pTemp[0] * 11 ) / 100;
  616. pTemp[2] = (unsigned char) ( ( dwRed * dwGray ) / (DWORD) 255 );
  617. pTemp[1] = (unsigned char) ( ( dwGreen * dwGray ) / (DWORD) 255 );
  618. pTemp[0] = (unsigned char) ( ( dwBlue * dwGray ) / (DWORD) 255 );
  619. pTemp += 3;
  620. }
  621. }
  622. break;
  623. case 32:
  624. for( y=nY1; y<=nY2; y++ ){
  625. pTemp = pBits;
  626. pTemp += ( ( ( m_pImageObject->GetHeight() - 1 - y ) * nWidthBytes ) + ( nX1 * 4 ) );
  627. for( x=nX1; x<=nX2; x++ ){
  628. pTemp[0] = 255 - pTemp[0];
  629. pTemp[1] = 255 - pTemp[1];
  630. pTemp[2] = 255 - pTemp[2];
  631. pTemp[3] = 255 - pTemp[3];
  632. pTemp += 4;
  633. }
  634. }
  635. break;
  636. }
  637. ::GlobalUnlock( m_pImageObject->GetDib() );
  638. m_pImageObject->m_nLastError = IMAGELIB_SUCCESS;
  639. return( TRUE );
  640. }
  641. void CImagePointProcesses::SetImageObjectClass( CImageObject *pImageObject )
  642. {
  643. m_pImageObject = pImageObject;
  644. }
  645. int *CImagePointProcesses::CreateHistogram( int nX1, int nY1, int nX2, int nY2, unsigned char *pData, RGBQUAD *pPalette, int nWidthBytes, CImageObject *pImageObject )
  646. {
  647. if( pImageObject != NULL ) m_pImageObject = pImageObject;
  648. if( m_pImageObject == NULL ) return( FALSE );
  649. m_pImageObject->NormalizeCoordinates( &nX1, &nY1, &nX2, &nY2 );
  650. int *pBuffer = new int [256*4+4];
  651. if( pBuffer == NULL ) return( NULL );
  652. memset( pBuffer, 0, ( 256 * 4 + 4 ) * sizeof( int ) );
  653. DWORD dwGray;
  654. int x, y;
  655. unsigned char *pTemp, ucRed, ucGreen, ucBlue;
  656. int Pixels = 0;
  657. int nHeight = m_pImageObject->GetHeight();
  658. switch( m_pImageObject->GetNumBits() ){
  659. case 1:
  660. break;
  661. case 4:
  662. break;
  663. case 8:
  664. for( y=0; y<nHeight; y++ ){
  665. pTemp = pData;
  666. pTemp += ( ( nHeight - 1 - y ) * nWidthBytes );
  667. pTemp += nX1;
  668. for( x=nX1; x<=nX2; x++ ){
  669. ucRed = pPalette[pTemp[x]].rgbRed;
  670. ucGreen = pPalette[pTemp[x]].rgbGreen;
  671. ucBlue = pPalette[pTemp[x]].rgbBlue;
  672. dwGray = ( (DWORD) ucRed * 30 +
  673. (DWORD) ucGreen * 59 +
  674. (DWORD) ucBlue * 11 ) / 100;
  675. dwGray &= 0x000000ff;
  676. pBuffer[dwGray]++;
  677. pBuffer[256+ucRed]++;
  678. pBuffer[512+ucBlue]++;
  679. pBuffer[768+ucGreen]++;
  680. Pixels++;
  681. }
  682. }
  683. break;
  684. case 16:
  685. for( y=0; y<nHeight; y++ ){
  686. pTemp = pData;
  687. pTemp += ( ( nHeight - 1 - y ) * nWidthBytes );
  688. pTemp += ( nX1 * 2 );
  689. for( x=nX1; x<=nX2; x++ ){
  690. GETRGB555( ucRed, ucGreen, ucBlue, pTemp );
  691. dwGray = ( (DWORD) ucRed * 30 +
  692. (DWORD) ucGreen * 59 +
  693. (DWORD) ucBlue * 11 ) / 100;
  694. dwGray &= 0x000000ff;
  695. pBuffer[dwGray]++;
  696. pBuffer[256+pTemp[x*3]]++;
  697. pBuffer[512+pTemp[x*3+1]]++;
  698. pBuffer[768+pTemp[x*3+2]]++;
  699. Pixels++;
  700. pTemp += 2;
  701. }
  702. }
  703. break;
  704. case 24:
  705. for( y=0; y<nHeight; y++ ){
  706. pTemp = pData;
  707. pTemp += ( ( nHeight - 1 - y ) * nWidthBytes );
  708. pTemp += ( nX1 * 3 );
  709. for( x=nX1; x<=nX2; x++ ){
  710. dwGray = ( (DWORD) pTemp[x*3+2] * 30 +
  711. (DWORD) pTemp[x*3+1] * 59 +
  712. (DWORD) pTemp[x*3] * 11 ) / 100;
  713. dwGray &= 0x000000ff;
  714. pBuffer[dwGray]++;
  715. pBuffer[256+pTemp[x*3]]++;
  716. pBuffer[512+pTemp[x*3+1]]++;
  717. pBuffer[768+pTemp[x*3+2]]++;
  718. Pixels++;
  719. }
  720. }
  721. break;
  722. case 32:
  723. for( y=0; y<nHeight; y++ ){
  724. pTemp = pData;
  725. pTemp += ( ( nHeight - 1 - y ) * nWidthBytes );
  726. pTemp += ( nX1 * 4 );
  727. for( x=nX1; x<=nX2; x++ ){
  728. GETRGB888( ucRed, ucGreen, ucBlue, pTemp );
  729. dwGray = ( (DWORD) ucRed * 30 +
  730. (DWORD) ucGreen * 59 +
  731. (DWORD) ucBlue * 11 ) / 100;
  732. dwGray &= 0x000000ff;
  733. pBuffer[dwGray]++;
  734. pBuffer[256+pTemp[x*3]]++;
  735. pBuffer[512+pTemp[x*3+1]]++;
  736. pBuffer[768+pTemp[x*3+2]]++;
  737. Pixels++;
  738. pTemp += 4;
  739. }
  740. }
  741. break;
  742. }
  743. pBuffer[0] = pBuffer[256] = pBuffer[512] = pBuffer[768] = 0;
  744. int Highest = 0, i, j;
  745. for( i=0; i<256*4; i++ ){
  746. if( pBuffer[i] > Highest ) Highest = pBuffer[i];
  747. }
  748. for( j=0; j<4; j++ ){
  749. for( i=0; i<256; i++ ) pBuffer[j*256+i] = ( pBuffer[j*256+i] * 255 ) / Highest;
  750. }
  751. Highest = 0;
  752. for( i=0; i<256*4; i++ ){
  753. if( pBuffer[i] > Highest ) Highest = pBuffer[i];
  754. }
  755. pBuffer[256*4] = Highest;
  756. pBuffer[256*4+1] = Highest / 25;
  757. for( i=0; i<256; i++ ){
  758. if( pBuffer[i] >= pBuffer[256*4+1] ) break;
  759. }
  760. pBuffer[256*4+2] = i;
  761. for( i=255; i>=0; i-- ){
  762. if( pBuffer[i] >= pBuffer[256*4+1] ) break;
  763. }
  764. pBuffer[256*4+3] = i;
  765. if( pBuffer[256*4+2] > 255 ) pBuffer[256*4+2] = 255;
  766. if( pBuffer[256*4+3] < 0 ) pBuffer[256*4+3] = 0;
  767. return( pBuffer );
  768. }
  769. BOOL CImagePointProcesses::FFTTrans(CImageObject *pImageObject)
  770. {
  771. if( pImageObject != NULL ) m_pImageObject = pImageObject;
  772. if( m_pImageObject == NULL ) return( FALSE );
  773. if( m_pImageObject->GetNumBits() == 1 ) return( FALSE );
  774. unsigned char *pBuffer, *pBits, *pTemp;
  775. BITMAPINFOHEADER *pBIH;
  776. RGBQUAD *pPalette;
  777. int nWidthBytes, nNumColors;
  778. pBuffer = (unsigned char *) m_pImageObject->GetDIBPointer( &nWidthBytes, m_pImageObject->GetNumBits() );
  779. if( pBuffer == NULL ) return( FALSE );
  780. pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
  781. nNumColors = m_pImageObject->GetNumColors();
  782. pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
  783. pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
  784.     int nTotalPixel = pBIH->biWidth * pBIH->biHeight;
  785. int nWidth = pBIH->biWidth;
  786. int nHeight = pBIH->biHeight;
  787. double (* fftBuffer)[2] = new double[nTotalPixel][2];
  788. long x, y;
  789. unsigned char ucRed, ucGreen, ucBlue;
  790. DWORD dwGray;
  791. switch( m_pImageObject->GetNumBits() )
  792. {
  793. case 1:
  794. break;
  795. case 4:
  796. break;
  797. case 8:
  798. for( y=0; y<nHeight; y++ ){
  799. pTemp = pBits;
  800. pTemp += y * nWidthBytes;
  801. for( x=0; x<nWidth; x++ ){
  802. ucRed = pPalette[pTemp[x]].rgbRed;
  803. ucGreen = pPalette[pTemp[x]].rgbGreen;
  804. ucBlue = pPalette[pTemp[x]].rgbBlue;
  805. dwGray = ( (DWORD) ucRed * 30 +
  806. (DWORD) ucGreen * 59 +
  807. (DWORD) ucBlue * 11 ) / 100;
  808. dwGray &= 0x000000ff;
  809. fftBuffer[y*nWidth+x][0] = (double) dwGray;
  810. fftBuffer[y*nWidth+x][1] = 0.0;
  811. }
  812. }
  813. break;
  814. }
  815. double * pCos =  new double[nHeight/2];
  816. double * pSin =  new double[nHeight/2];
  817. int * l = new int[nHeight];
  818. calW(pCos, pSin, l, nHeight);
  819. // char strTime[35];
  820. // LARGE_INTEGER Frequency;
  821. // LARGE_INTEGER PerformanceCount1, PerformanceCount2;
  822. // QueryPerformanceFrequency(&Frequency);
  823. // QueryPerformanceCounter(&PerformanceCount1);
  824. for(y=0; y<nHeight; y++){
  825. fft(fftBuffer+nWidth*y, pCos, pSin, l, nWidth);
  826. }
  827. imposition(fftBuffer, nWidth);
  828. for(x=0; x<nWidth; x++){
  829. fft(fftBuffer+nHeight*x, pCos, pSin, l, nHeight);
  830. }
  831. imposition(fftBuffer, nHeight);
  832. // QueryPerformanceCounter(&PerformanceCount2);
  833. // sprintf(strTime, "共耗时:%ld", PerformanceCount2.QuadPart-PerformanceCount1.QuadPart);
  834. // AfxMessageBox(strTime);
  835. double max = 0.0;
  836. for(y=0; y<nHeight; y++){
  837. for(x=0; x<nWidth; x++){
  838. double real = fftBuffer[y*nWidth+x][0];
  839. double img = fftBuffer[y*nWidth+x][1];
  840. double amp;
  841. amp = fftBuffer[y*nWidth+x][0] = log(sqrt(real*real + img*img)+1.0);
  842. max = ((amp>max) ? amp : max);
  843. }
  844. }
  845. for(y=0; y<nHeight; y++){
  846. for(x=0; x<nWidth; x++){
  847. long newx = (x>127)?(x-128):(x+128);
  848. long newy = (y>127)?(y-128):(y+128);
  849. pBits[newy*nWidthBytes+newx] = (unsigned char)(fftBuffer[y*nWidth+x][0]/max * 255.0);
  850. }
  851. }
  852. ::GlobalUnlock( m_pImageObject->GetDib() );
  853. delete[] fftBuffer;
  854. delete[] pCos;
  855. delete[] pSin;
  856. delete[] l;
  857. m_pImageObject->m_nLastError = IMAGELIB_SUCCESS;
  858. return( TRUE );
  859. }
  860. BOOL CImagePointProcesses::DCTTrans(CImageObject * pImageObject)
  861. {
  862. if( pImageObject != NULL ) m_pImageObject = pImageObject;
  863. if( m_pImageObject == NULL ) return( FALSE );
  864. if( m_pImageObject->GetNumBits() == 1 ) return( FALSE );
  865. unsigned char *pBuffer, *pBits, *pTemp;
  866. BITMAPINFOHEADER *pBIH;
  867. RGBQUAD *pPalette;
  868. int nWidthBytes, nNumColors;
  869. pBuffer = (unsigned char *) m_pImageObject->GetDIBPointer( &nWidthBytes, m_pImageObject->GetNumBits() );
  870. if( pBuffer == NULL ) return( FALSE );
  871. pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
  872. nNumColors = m_pImageObject->GetNumColors();
  873. pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
  874. pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
  875.     int nTotalPixel = pBIH->biWidth * pBIH->biHeight;
  876. int nWidth = pBIH->biWidth;
  877. int nHeight = pBIH->biHeight;
  878. double (* dctBuffer) = new double[nTotalPixel];
  879. long x, y;
  880. unsigned char ucRed, ucGreen, ucBlue;
  881. DWORD dwGray;
  882. switch( m_pImageObject->GetNumBits() )
  883. {
  884. case 1:
  885. break;
  886. case 4:
  887. break;
  888. case 8:
  889. for( y=0; y<nHeight; y++ ){
  890. pTemp = pBits;
  891. pTemp += y * nWidthBytes;
  892. for( x=0; x<nWidth; x++ ){
  893. ucRed = pPalette[pTemp[x]].rgbRed;
  894. ucGreen = pPalette[pTemp[x]].rgbGreen;
  895. ucBlue = pPalette[pTemp[x]].rgbBlue;
  896. dwGray = ( (DWORD) ucRed * 30 +
  897. (DWORD) ucGreen * 59 +
  898. (DWORD) ucBlue * 11 ) / 100;
  899. dwGray &= 0x000000ff;
  900. dctBuffer[y*nWidth+x] = (double) dwGray;
  901. }
  902. }
  903. break;
  904. }
  905. double * pCos =  new double[nHeight/2];
  906. double * pSin =  new double[nHeight/2];
  907. int * l = new int[nHeight];
  908. calW(pCos, pSin, l, nHeight);
  909. for(y=0; y<nHeight; y++){
  910. dct(dctBuffer+nWidth*y, pCos, pSin, l, nWidth);
  911. }
  912. imposition(dctBuffer, nWidth);
  913. for(x=0; x<nWidth; x++){
  914. dct(dctBuffer+nHeight*x, pCos, pSin, l, nHeight);
  915. }
  916. imposition(dctBuffer, nHeight);
  917. double max = 0.0;
  918. for(y=0; y<nHeight; y++){
  919. for(x=0; x<nWidth; x++){
  920. double result;
  921. result = dctBuffer[y*nWidth+x] = log10(fabs(dctBuffer[y*nWidth+x])+1.0);
  922. max = ((result>max) ? result : max);
  923. }
  924. }
  925. for(y=0; y<nHeight; y++){
  926. for(x=0; x<nWidth; x++){
  927. pBits[y*nWidth+x] = (unsigned char)(dctBuffer[(nHeight-1-y)*nWidth+x]/max*255.0);
  928. }
  929. }
  930. delete[] dctBuffer;
  931. delete[] pCos;
  932. delete[] pSin;
  933. delete[] l;
  934. ::GlobalUnlock( m_pImageObject->GetDib() );
  935. m_pImageObject->m_nLastError = IMAGELIB_SUCCESS;
  936. return( TRUE );
  937. }
  938. BOOL CImagePointProcesses::EdgeDetect(CImageObject *pImageObject)
  939. {
  940. if( pImageObject != NULL ) m_pImageObject = pImageObject;
  941. if( m_pImageObject == NULL ) return( FALSE );
  942. if( m_pImageObject->GetNumBits() == 1 ) return( FALSE );
  943. unsigned char *pBuffer, *pBits, *pTemp;
  944. BITMAPINFOHEADER *pBIH;
  945. RGBQUAD *pPalette;
  946. int nWidthBytes, nNumColors;
  947. pBuffer = (unsigned char *) m_pImageObject->GetDIBPointer( &nWidthBytes, m_pImageObject->GetNumBits() );
  948. if( pBuffer == NULL ) return( FALSE );
  949. pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
  950. nNumColors = m_pImageObject->GetNumColors();
  951. pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
  952. pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
  953.     int nTotalPixel = pBIH->biWidth * pBIH->biHeight;
  954. int nWidth = pBIH->biWidth;
  955. int nHeight = pBIH->biHeight;
  956. double * Buffer = new double[nTotalPixel];
  957. double * Bridge = new double[nTotalPixel];
  958. long x, y;
  959. unsigned char ucRed, ucGreen, ucBlue;
  960. DWORD dwGray;
  961. switch( m_pImageObject->GetNumBits() )
  962. {
  963. case 1:
  964. break;
  965. case 4:
  966. break;
  967. case 8:
  968. for( y=0; y<nHeight; y++ ){
  969. pTemp = pBits;
  970. pTemp += y * nWidthBytes;
  971. for( x=0; x<nWidth; x++ ){
  972. ucRed = pPalette[pTemp[x]].rgbRed;
  973. ucGreen = pPalette[pTemp[x]].rgbGreen;
  974. ucBlue = pPalette[pTemp[x]].rgbBlue;
  975. dwGray = ( (DWORD) ucRed * 30 +
  976. (DWORD) ucGreen * 59 +
  977. (DWORD) ucBlue * 11 ) / 100;
  978. dwGray &= 0x000000ff;
  979. Buffer[y*nWidth+x] = Bridge[y*nWidth+x] = (double) dwGray;
  980. }
  981. }
  982. break;
  983. }
  984. double temp1, temp2;
  985. for(y=1; y<nHeight-1; y++)
  986. {
  987. for(x=1; x<nWidth-1; x++)
  988. {
  989. switch(EdgeDetectType)
  990. {
  991. case LAPLACE:
  992.    temp1 = -Bridge[(x-1)+y*nWidth]
  993.    -Bridge[(x+1)+y*nWidth]
  994.    -Bridge[x+(y-1)*nWidth]
  995.    -Bridge[x+(y+1)*nWidth]
  996.    +Bridge[x+y*nWidth]*4;
  997.    temp2 = -Bridge[(x-1)+(y-1)*nWidth]
  998.    -Bridge[x+(y-1)*nWidth]
  999.    -Bridge[(x+1)+(y-1)*nWidth]
  1000.    -Bridge[(x-1)+y*nWidth]
  1001.    +Bridge[x+y*nWidth]*8
  1002.    -Bridge[(x+1)+y*nWidth]
  1003.    -Bridge[(x-1)+(y+1)*nWidth]
  1004.    -Bridge[x+(y+1)*nWidth]
  1005.    -Bridge[(x+1)+(y+1)*nWidth];
  1006.    Buffer[x+y*nWidth]=temp1+temp2;
  1007.    break;
  1008. case SOBEL:
  1009.    temp1 = -Bridge[(x-1)+(y-1)*nWidth]
  1010.    +Bridge[(x+1)+(y-1)*nWidth]
  1011.    -Bridge[(x-1)+y*nWidth]*2
  1012.    +Bridge[(x+1)+y*nWidth]*2
  1013.    -Bridge[(x-1)+(y+1)*nWidth]
  1014.    +Bridge[(x+1)+(y+1)*nWidth];
  1015.    temp2 = Bridge[(x-1)+(y-1)*nWidth]
  1016.    +Bridge[x+(y-1)*nWidth]*2
  1017.    +Bridge[(x+1)+(y-1)*nWidth]
  1018.    -Bridge[(x-1)+(y+1)*nWidth]
  1019.    -Bridge[x+(y+1)*nWidth]*2
  1020.    -Bridge[(x+1)+(y+1)*nWidth];
  1021.    Buffer[x+y*nWidth]=temp1+temp2;
  1022.    break;
  1023. case PREWITT:
  1024.    temp1 = -Bridge[(x-1)+(y-1)*nWidth]
  1025.    +Bridge[(x+1)+(y-1)*nWidth]
  1026.    -Bridge[(x-1)+y*nWidth]
  1027.    +Bridge[(x+1)+y*nWidth]
  1028.    -Bridge[(x-1)+(y+1)*nWidth]
  1029.    +Bridge[(x+1)+(y+1)*nWidth];
  1030.    temp2 = Bridge[(x-1)+(y-1)*nWidth]
  1031.    +Bridge[x+(y-1)*nWidth]
  1032.    +Bridge[(x+1)+(y-1)*nWidth]
  1033.    -Bridge[(x-1)+(y+1)*nWidth]
  1034.    -Bridge[x+(y+1)*nWidth]
  1035.    -Bridge[(x+1)+(y+1)*nWidth];
  1036.    Buffer[x+y*nWidth]=temp1+temp2;
  1037.    break;
  1038. }
  1039. }
  1040. }
  1041. double max = 0.0;
  1042. double min = 0.0;
  1043. for(y=0; y<nHeight; y++){
  1044. for(x=0; x<nWidth; x++){
  1045. double amp = Buffer[y*nWidth+x];
  1046. max = ((amp>max) ? amp : max);
  1047. min = ((amp<min) ? amp : min);
  1048. }
  1049. }
  1050. for(y=0; y<nHeight; y++){
  1051. for(x=0; x<nWidth; x++){
  1052. if(Embossed)
  1053. pBits[y*nWidthBytes+x] = (unsigned char)((Buffer[y*nWidth+x]-min)/(max-min)*255.0);
  1054. else
  1055. {
  1056. if(Buffer[y*nWidth+x]>255.0) Buffer[y*nWidth+x]=255.0;
  1057. else if(Buffer[y*nWidth+x]<0.0) Buffer[y*nWidth+x] = 0.0;
  1058. pBits[y*nWidthBytes+x] = (unsigned char)Buffer[y*nWidth+x];
  1059. }
  1060. }
  1061. }
  1062. ::GlobalUnlock( m_pImageObject->GetDib() );
  1063. if(Buffer) delete[] Buffer;
  1064. if(Bridge) delete[] Bridge;
  1065. m_pImageObject->m_nLastError = IMAGELIB_SUCCESS;
  1066. return( TRUE );
  1067. }
  1068. BOOL CImagePointProcesses::AddNoise(CImageObject * pImageObject, int nRatio)
  1069. {
  1070. if( pImageObject != NULL ) m_pImageObject = pImageObject;
  1071. if( m_pImageObject == NULL ) return( FALSE );
  1072. if( m_pImageObject->GetNumBits() == 1 ) return( FALSE );
  1073. unsigned char *pBuffer, *pBits;
  1074. BITMAPINFOHEADER *pBIH;
  1075. RGBQUAD *pPalette;
  1076. int nWidthBytes, nNumColors;
  1077. pBuffer = (unsigned char *) m_pImageObject->GetDIBPointer( &nWidthBytes, m_pImageObject->GetNumBits() );
  1078. if( pBuffer == NULL ) return( FALSE );
  1079. pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
  1080. nNumColors = m_pImageObject->GetNumColors();
  1081. pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
  1082. pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
  1083.     int nTotalPixel = pBIH->biWidth * pBIH->biHeight;
  1084. int nWidth = pBIH->biWidth;
  1085. int nHeight = pBIH->biHeight;
  1086. long x, y;
  1087. int temp;
  1088. srand( (unsigned)time(NULL) );
  1089. for(y=0; y<nHeight; y++){
  1090. for(x=0; x<nWidth; x++)
  1091. {
  1092. temp = rand();
  1093. if(temp < RAND_MAX*nRatio/100) pBits[y*nWidthBytes+x] = (unsigned char)255.0;
  1094. }
  1095. }
  1096. ::GlobalUnlock( m_pImageObject->GetDib() );
  1097. m_pImageObject->m_nLastError = IMAGELIB_SUCCESS;
  1098. return( TRUE );
  1099. }
  1100. BOOL CImagePointProcesses::ExtractRiver(CPoint *pStartPoint, CImageObject *pImageObject)
  1101. {
  1102. CPoint presetPoint(42, 6);
  1103. if( pImageObject != NULL ) m_pImageObject = pImageObject;
  1104. if( m_pImageObject == NULL ) return( FALSE );
  1105. if(pStartPoint == NULL)
  1106. {
  1107. pStartPoint = &presetPoint;
  1108. }
  1109. EdgeDetectType = LAPLACE;
  1110. if( m_pImageObject->GetNumBits() == 1 ) return( FALSE );
  1111. unsigned char *pBuffer, *pBits, *pTemp;
  1112. BITMAPINFOHEADER *pBIH;
  1113. RGBQUAD *pPalette;
  1114. int nWidthBytes, nNumColors;
  1115. pBuffer = (unsigned char *) m_pImageObject->GetDIBPointer( &nWidthBytes, m_pImageObject->GetNumBits() );
  1116. if( pBuffer == NULL ) return( FALSE );
  1117. pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
  1118. nNumColors = m_pImageObject->GetNumColors();
  1119. pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
  1120. pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
  1121.     int nTotalPixel = pBIH->biWidth * pBIH->biHeight;
  1122. int nWidth = pBIH->biWidth;
  1123. int nHeight = pBIH->biHeight;
  1124. double * Buffer = new double[nTotalPixel];
  1125. double * Bridge = new double[nTotalPixel];
  1126. long x, y;
  1127. unsigned char ucRed, ucGreen, ucBlue;
  1128. DWORD dwGray;
  1129. switch( m_pImageObject->GetNumBits() )
  1130. {
  1131. case 1:
  1132. break;
  1133. case 4:
  1134. break;
  1135. case 8:
  1136. for( y=0; y<nHeight; y++ ){
  1137. pTemp = pBits;
  1138. pTemp += y * nWidthBytes;
  1139. for( x=0; x<nWidth; x++ ){
  1140. ucRed = pPalette[pTemp[x]].rgbRed;
  1141. ucGreen = pPalette[pTemp[x]].rgbGreen;
  1142. ucBlue = pPalette[pTemp[x]].rgbBlue;
  1143. dwGray = ( (DWORD) ucRed * 30 +
  1144. (DWORD) ucGreen * 59 +
  1145. (DWORD) ucBlue * 11 ) / 100;
  1146. dwGray &= 0x000000ff;
  1147. Buffer[y*nWidth+x] = Bridge[y*nWidth+x] = (double) dwGray;
  1148. }
  1149. }
  1150. break;
  1151. }
  1152. /* double temp1, temp2;
  1153. for(y=1; y<nHeight-1; y++)
  1154. {
  1155. for(x=1; x<nWidth-1; x++)
  1156. {
  1157. switch(EdgeDetectType)
  1158. {
  1159. case LAPLACE:
  1160.    temp1 = -Bridge[(x-1)+y*nWidth]
  1161.    -Bridge[(x+1)+y*nWidth]
  1162.    -Bridge[x+(y-1)*nWidth]
  1163.    -Bridge[x+(y+1)*nWidth]
  1164.    +Bridge[x+y*nWidth]*4;
  1165.    temp2 = -Bridge[(x-1)+(y-1)*nWidth]
  1166.    -Bridge[x+(y-1)*nWidth]
  1167.    -Bridge[(x+1)+(y-1)*nWidth]
  1168.    -Bridge[(x-1)+y*nWidth]
  1169.    +Bridge[x+y*nWidth]*8
  1170.    -Bridge[(x+1)+y*nWidth]
  1171.    -Bridge[(x-1)+(y+1)*nWidth]
  1172.    -Bridge[x+(y+1)*nWidth]
  1173.    -Bridge[(x+1)+(y+1)*nWidth];
  1174.    Buffer[x+y*nWidth]=temp1+temp2;
  1175.    break;
  1176. case SOBEL:
  1177.    temp1 = -Bridge[(x-1)+(y-1)*nWidth]
  1178.    +Bridge[(x+1)+(y-1)*nWidth]
  1179.    -Bridge[(x-1)+y*nWidth]*2
  1180.    +Bridge[(x+1)+y*nWidth]*2
  1181.    -Bridge[(x-1)+(y+1)*nWidth]
  1182.    +Bridge[(x+1)+(y+1)*nWidth];
  1183.    temp2 = Bridge[(x-1)+(y-1)*nWidth]
  1184.    +Bridge[x+(y-1)*nWidth]*2
  1185.    +Bridge[(x+1)+(y-1)*nWidth]
  1186.    -Bridge[(x-1)+(y+1)*nWidth]
  1187.    -Bridge[x+(y+1)*nWidth]*2
  1188.    -Bridge[(x+1)+(y+1)*nWidth];
  1189.    Buffer[x+y*nWidth]=temp1+temp2;
  1190.    break;
  1191. case PREWITT:
  1192.    temp1 = -Bridge[(x-1)+(y-1)*nWidth]
  1193.    +Bridge[(x+1)+(y-1)*nWidth]
  1194.    -Bridge[(x-1)+y*nWidth]
  1195.    +Bridge[(x+1)+y*nWidth]
  1196.    -Bridge[(x-1)+(y+1)*nWidth]
  1197.    +Bridge[(x+1)+(y+1)*nWidth];
  1198.    temp2 = Bridge[(x-1)+(y-1)*nWidth]
  1199.    +Bridge[x+(y-1)*nWidth]
  1200.    +Bridge[(x+1)+(y-1)*nWidth]
  1201.    -Bridge[(x-1)+(y+1)*nWidth]
  1202.    -Bridge[x+(y+1)*nWidth]
  1203.    -Bridge[(x+1)+(y+1)*nWidth];
  1204.    Buffer[x+y*nWidth]=temp1+temp2;
  1205.    break;
  1206. }
  1207. }
  1208. }
  1209. double max = 0.0;
  1210. double min = 0.0;
  1211. for(y=0; y<nHeight; y++){
  1212. for(x=0; x<nWidth; x++){
  1213. double amp = Buffer[y*nWidth+x];
  1214. max = ((amp>max) ? amp : max);
  1215. min = ((amp<min) ? amp : min);
  1216. }
  1217. }
  1218. for(y=0; y<nHeight; y++){
  1219. for(x=0; x<nWidth; x++){
  1220. if(Embossed)
  1221. pBits[y*nWidthBytes+x] = (unsigned char)((Buffer[y*nWidth+x]-min)/(max-min)*255.0);
  1222. else
  1223. {
  1224. // if(Buffer[y*nWidth+x]>255.0) Buffer[y*nWidth+x]=255.0;
  1225. // else if(Buffer[y*nWidth+x]<0.0) Buffer[y*nWidth+x] = 0.0;
  1226. #define SIDE 1
  1227. if(y > SIDE && y < 255-SIDE && x > SIDE && x < 255-SIDE)
  1228. {
  1229. if(Buffer[y*nWidth+x]>150.0)
  1230. Buffer[y*nWidth+x]=0.0;
  1231. else if(Buffer[y*nWidth+x]<=150.0)
  1232. Buffer[y*nWidth+x] = 255.0;
  1233. }
  1234. else
  1235. Buffer[y*nWidth+x] = 255.0;
  1236. pBits[y*nWidthBytes+x] = (unsigned char)Buffer[y*nWidth+x];
  1237. }
  1238. }
  1239. }
  1240. */
  1241. for(y=0; y<nHeight; y++){
  1242. for(x=0; x<nWidth; x++){
  1243. if(Buffer[y*nWidth+x]>150.0)
  1244. Buffer[y*nWidth+x]=255.0;
  1245. else if(Buffer[y*nWidth+x]<=150.0)
  1246. Buffer[y*nWidth+x] = 0.0;
  1247. pBits[y*nWidthBytes+x] = (unsigned char)Buffer[y*nWidth+x];
  1248. }
  1249. }
  1250. //提取河流
  1251. TraceDIB((char *)pBits, nWidth, nHeight);
  1252. /*
  1253. #define NEAR_POINT 4
  1254. double CurPointColor = Buffer[pStartPoint->x + nWidth*pStartPoint->y];
  1255. int curX = pStartPoint->x;
  1256. int count = 0;
  1257. double dist = 0.0;
  1258. int threshold = 1;
  1259. int upper_thres = 250;
  1260. int low_thres = 250;
  1261. int j;
  1262. RiverTrack[0].x = 44;//pStartPoint->x;
  1263. RiverTrack[0].y = 4;pStartPoint->y;
  1264. // for(x = RiverTrack[0].x; x < nWidth; x ++)
  1265. // {
  1266. // for(y = 0; y < 256; y ++)
  1267. for(y = RiverTrack[0].y; y < nHeight; y ++)
  1268. {
  1269. for(x = 0; x < 256; x ++)
  1270. {
  1271. if(Buffer[y*nWidth + x] >= upper_thres)
  1272. {
  1273. count ++;
  1274. RiverTrack[count].x = x;
  1275. RiverTrack[count].y = y;
  1276. }
  1277. else if(Buffer[y*nWidth + x] >= low_thres)
  1278. {
  1279. dist = (x-RiverTrack[count].x)*(x-RiverTrack[count].x)
  1280. + (y-RiverTrack[count].y)*(y-RiverTrack[count].y);
  1281. if(dist < threshold * threshold)
  1282. {
  1283. count ++;
  1284. RiverTrack[count].x = x;
  1285. RiverTrack[count].y = y;
  1286. }
  1287. }
  1288. }
  1289. }
  1290. //画出来
  1291. for(y = 0; y < nHeight; y ++)
  1292. for(x = 0; x < nWidth; x ++)
  1293. pBits[y*nWidthBytes + x] = 0;
  1294. for(j=0; j<count; j++)
  1295. {
  1296. pBits[RiverTrack[j].y*nWidthBytes + RiverTrack[j].x] = 255;
  1297. }
  1298. */
  1299. ::GlobalUnlock( m_pImageObject->GetDib() );
  1300. if(Buffer) delete[] Buffer;
  1301. if(Bridge) delete[] Bridge;
  1302. m_pImageObject->m_nLastError = IMAGELIB_SUCCESS;
  1303. return( TRUE );
  1304. }