QQBitmap.cpp
上传用户:cxh888fhc
上传日期:2017-07-08
资源大小:240k
文件大小:18k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. // QQBitmap.cpp: implementation of the CQQBitmap class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "CQQFind.h"
  6. #include "QQBitmap.h"
  7. #include <math.h>
  8. #include <winable.h>
  9. #include <winuser.h>
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[]=__FILE__;
  13. #define new DEBUG_NEW
  14. #endif
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. CQQBitmap::CQQBitmap()
  19. {
  20. m_hWnd=(HWND)-1;
  21. }
  22. CQQBitmap::CQQBitmap(CString strFilePath)
  23. {
  24. //以一个数据文件作为初始化,供测试用
  25. #ifdef _DEBUG
  26. CFile file;
  27. if(GetFileAttributes(strFilePath)==-1)
  28. {
  29. return ;
  30. }
  31. if(!file.Open(strFilePath,CFile::modeRead))
  32. return ;
  33. BITMAPFILEHEADER bmfih;
  34. DWORD nFileLen;
  35. nFileLen=file.GetLength();
  36. if(file.Read((LPSTR)&bmfih,sizeof(bmfih))!=sizeof(bmfih))
  37. {
  38. file.Close();
  39. return;
  40. }
  41. if(bmfih.bfType!=((WORD)('M'<<8)|'B'))
  42. MessageBox(NULL,"不是bmp文件!","错误",MB_ICONWARNING);
  43. file.Close();
  44. return ;
  45. }
  46. HGLOBAL hDIB=::GlobalAlloc(GMEM_FIXED,nFileLen);
  47. if(hDIB==NULL)
  48. {
  49. file.Close();
  50. return ;
  51. }
  52. if(file.ReadHuge((LPSTR)hDIB,nFileLen-sizeof(BITMAPFILEHEADER))!=
  53. nFileLen-sizeof(BITMAPFILEHEADER))
  54. {
  55. ::GlobalFree(hDIB);
  56. file.Close();
  57. return ;
  58. }
  59. BITMAPINFO &bmInfo=*(LPBITMAPINFO)::GlobalLock(hDIB); 
  60. BYTE *pBmpPixelBuffer=(BYTE *)&bmInfo+bmfih.bfOffBits-
  61. sizeof(BITMAPFILEHEADER);                                                                                       
  62. CClientDC dc(NULL); 
  63. HBITMAP hBitmap;
  64. hBitmap=CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER *)&bmInfo,
  65. CBM_INIT,(VOID *)pBmpPixelBuffer,&bmInfo,DIB_RGB_COLORS);
  66. ::GlobalUnlock(hDIB); 
  67. ::GlobalFree(hDIB);
  68. file.Close();
  69. m_bpAllPicture.Attach(hBitmap);
  70. CheckStyle();
  71. DividPicture();
  72. FindDifferent();
  73. #endif
  74. }
  75. CQQBitmap::~CQQBitmap()
  76. {
  77. m_hWnd=(HWND)-1;
  78. }
  79. CQQBitmap::CQQBitmap(HWND hWnd)
  80. {
  81. m_hWnd=hWnd;
  82. ::BringWindowToTop(hWnd);
  83. CClientDC dc(CWnd::FromHandle(hWnd));
  84. int BitPerPixel=dc.GetDeviceCaps(BITSPIXEL);
  85. CRect rcTemp;
  86. ::GetClientRect(hWnd,rcTemp);
  87. int Width=rcTemp.right;
  88. int Height=rcTemp.bottom;
  89. CDC memDC;
  90. memDC.CreateCompatibleDC(&dc);
  91. CBitmap *pOldmemBitmap;
  92. m_bpAllPicture.CreateCompatibleBitmap(&dc,Width,Height);
  93. pOldmemBitmap=memDC.SelectObject(&m_bpAllPicture);
  94. memDC.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
  95. memDC.SelectObject(pOldmemBitmap);
  96. CheckStyle();
  97. DividPicture();
  98. FindDifferent();
  99. }
  100. BOOL CQQBitmap::SetCurrenthWnd(HWND hWnd)
  101. {
  102. if(hWnd!=(HWND)-1)
  103. {
  104. m_hWnd=hWnd;
  105. if(hWnd==NULL)
  106. {
  107. MessageBox(NULL,"没有开启QQ游戏!","错误",MB_ICONWARNING);
  108. return FALSE;
  109. }
  110. ::BringWindowToTop(hWnd);
  111. CClientDC dc(CWnd::FromHandle(hWnd));
  112. int BitPerPixel=dc.GetDeviceCaps(BITSPIXEL);
  113. CRect rcTemp;
  114. ::GetClientRect(hWnd,rcTemp);
  115. int Width=rcTemp.right;
  116. int Height=rcTemp.bottom;
  117. CDC memDC;
  118. memDC.CreateCompatibleDC(&dc);
  119. CBitmap *pOldmemBitmap;
  120. m_bpAllPicture.CreateCompatibleBitmap(&dc,Width,Height);
  121. pOldmemBitmap=memDC.SelectObject(&m_bpAllPicture);
  122. memDC.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
  123. memDC.SelectObject(pOldmemBitmap);
  124. DividPicture();
  125. FindDifferent();
  126. return TRUE;
  127. }
  128. return FALSE;
  129. }
  130. BOOL CQQBitmap::DividPicture()
  131. {
  132. /////////////////////////////////////////////////
  133. DividPictureV();
  134. DividPictureH();
  135. //图片划分完毕.可以开始找数据了
  136. return TRUE;
  137. }
  138. void CQQBitmap::PrintBitmapToFile(CString strFilePath,BOOL bBitmapFormat)
  139. {
  140. #ifdef _DEBUG
  141. if(m_bpAllPicture.m_hObject==NULL)
  142. {
  143. return ;
  144. }
  145. BITMAP bmp;
  146. CClientDC dc(NULL);
  147. m_bpAllPicture.GetBitmap(&bmp);
  148. strFilePath.Insert(strFilePath.GetLength()-4,"All");
  149. CFile file(strFilePath,CFile::modeWrite|CFile::modeCreate);
  150. strFilePath.Delete(strFilePath.GetLength()-7,3);
  151. BITMAPINFOHEADER bih={0};
  152. bih.biBitCount=bmp.bmBitsPixel;
  153. bih.biCompression=BI_RGB;
  154. bih.biHeight=bmp.bmHeight;
  155. bih.biPlanes=1;
  156. bih.biSize=sizeof(BITMAPINFOHEADER);
  157. bih.biSizeImage=bmp.bmWidthBytes*bmp.bmHeight;
  158. bih.biWidth=bmp.bmWidth;
  159. BITMAPFILEHEADER bfh={0};
  160. bfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  161. bfh.bfSize=bfh.bfOffBits+bmp.bmWidthBytes*bmp.bmHeight;
  162. bfh.bfType=(WORD)(_T('M')<<8|_T('B'));
  163. file.Write(&bfh,sizeof(BITMAPFILEHEADER));
  164. file.Write(&bih,sizeof(BITMAPINFOHEADER));
  165. BYTE *p=new BYTE[bmp.bmWidthBytes * bmp.bmHeight];
  166. if(bBitmapFormat==TRUE)
  167. {
  168. GetDIBits( dc.m_hDC,(HBITMAP)m_bpAllPicture,0,bmp.bmHeight,p,
  169. (LPBITMAPINFO)&bih,DIB_RGB_COLORS);
  170. }
  171. else
  172. {
  173. m_bpAllPicture.GetBitmapBits(bmp.bmWidthBytes * bmp.bmHeight,(LPVOID)p);
  174. }
  175. file.WriteHuge(p,bmp.bmWidthBytes * bmp.bmHeight);
  176. delete[] p;
  177. file.Close();
  178. if(m_bpPicture1.m_hObject==NULL)
  179. {
  180. return;
  181. }
  182. m_bpPicture1.GetBitmap(&bmp);
  183. strFilePath.Insert(strFilePath.GetLength()-4,"Prt1");
  184. CFile file1(strFilePath,CFile::modeWrite|CFile::modeCreate);
  185. strFilePath.Delete(strFilePath.GetLength()-8,4);
  186. memset(&bih,0,sizeof(BITMAPINFOHEADER));
  187. bih.biBitCount=bmp.bmBitsPixel;
  188. bih.biCompression=BI_RGB;
  189. bih.biHeight=bmp.bmHeight;
  190. bih.biPlanes=1;
  191. bih.biSize=sizeof(BITMAPINFOHEADER);
  192. bih.biSizeImage=bmp.bmWidthBytes*bmp.bmHeight;
  193. bih.biWidth=bmp.bmWidth;
  194. memset(&bfh,0,sizeof(BITMAPFILEHEADER));
  195. bfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  196. bfh.bfSize=bfh.bfOffBits+bmp.bmWidthBytes*bmp.bmHeight;
  197. bfh.bfType=(WORD)(_T('M')<<8|_T('B'));
  198. file1.Write(&bfh,sizeof(BITMAPFILEHEADER));
  199. file1.Write(&bih,sizeof(BITMAPINFOHEADER));
  200. BYTE *p1=new BYTE[bmp.bmWidthBytes * bmp.bmHeight];
  201. if(bBitmapFormat==TRUE)
  202. {
  203. GetDIBits( dc.m_hDC,(HBITMAP)m_bpPicture1,0,bmp.bmHeight,p1,
  204. (LPBITMAPINFO)&bih,DIB_RGB_COLORS);
  205. }
  206. else
  207. {
  208. m_bpPicture1.GetBitmapBits(bmp.bmWidthBytes * bmp.bmHeight,(LPVOID)p1);
  209. }
  210. file1.WriteHuge(p1,bmp.bmWidthBytes * bmp.bmHeight);
  211. file1.Close();
  212. delete[] p1;
  213. if(m_bpPicture2.m_hObject==NULL)
  214. {
  215. return;
  216. }
  217. m_bpPicture2.GetBitmap(&bmp);
  218. strFilePath.Insert(strFilePath.GetLength()-4,"Prt2");
  219. CFile file2(strFilePath,CFile::modeWrite|CFile::modeCreate);
  220. strFilePath.Delete(strFilePath.GetLength()-8,4);
  221. memset(&bih,0,sizeof(BITMAPINFOHEADER));
  222. bih.biBitCount=bmp.bmBitsPixel;
  223. bih.biCompression=BI_RGB;
  224. bih.biHeight=bmp.bmHeight;
  225. bih.biPlanes=1;
  226. bih.biSize=sizeof(BITMAPINFOHEADER);
  227. bih.biSizeImage=bmp.bmWidthBytes*bmp.bmHeight;
  228. bih.biWidth=bmp.bmWidth;
  229. memset(&bfh,0,sizeof(BITMAPFILEHEADER));
  230. bfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  231. bfh.bfSize=bfh.bfOffBits+bmp.bmWidthBytes*bmp.bmHeight;
  232. bfh.bfType=(WORD)(_T('M')<<8|_T('B'));
  233. file2.Write(&bfh,sizeof(BITMAPFILEHEADER));
  234. file2.Write(&bih,sizeof(BITMAPINFOHEADER));
  235. BYTE *p2=new BYTE[bmp.bmWidthBytes * bmp.bmHeight];
  236. if(bBitmapFormat==TRUE)
  237. {
  238. GetDIBits( dc.m_hDC,(HBITMAP)m_bpPicture2,0,bmp.bmHeight,p2,
  239. (LPBITMAPINFO)&bih,DIB_RGB_COLORS);
  240. }
  241. else
  242. {
  243. m_bpPicture2.GetBitmapBits(bmp.bmWidthBytes * bmp.bmHeight,(LPVOID)p2);
  244. }
  245. file2.WriteHuge(p2,bmp.bmWidthBytes * bmp.bmHeight);
  246. file2.Close();
  247. delete []p2;
  248. #endif
  249. }
  250. BOOL CQQBitmap::DividPictureV()
  251. {
  252. //垂直分割图片,以m_bpAllPicture为蓝本,结果保存到m_bpPicture1中
  253. BITMAP bmp;
  254. m_bpAllPicture.GetBitmap(&bmp);
  255. int nPosX=bmp.bmWidthBytes;
  256. int nPosY=bmp.bmHeight;
  257. BYTE *pData1=new BYTE[nPosX*nPosY];
  258. m_bpAllPicture.GetBitmapBits(bmp.bmWidthBytes * bmp.bmHeight,(LPVOID)pData1);
  259. LONG *pData=(LONG*)pData1;
  260. ASSERT(nPosX%4==0);
  261. nPosX/=4;
  262. // int x,y;
  263. //
  264. // int nSameColorLineX=0;
  265. // BOOL bNewBegin=TRUE;
  266. // int nTop=-1,nBottom=-1;
  267. // //此标志为真,预示着当前正在经历非线条
  268. //
  269. // for(y=0;y<nPosY;y++)
  270. // {
  271. // LONG tempPre;
  272. //
  273. // int nDiff=0;
  274. // for(x=0;x<nPosX;x++)
  275. // {
  276. // LONG temp=pData[y*nPosX+x];
  277. // if(x==0)
  278. // {
  279. // tempPre=temp;
  280. // continue;
  281. // }
  282. //
  283. // BYTE /*t4,*/t3,t2,t1;
  284. //// t4=HIBYTE(HIWORD(temp)); //保留
  285. // t3=LOBYTE(HIWORD(temp)); //红色
  286. // t2=HIBYTE(LOWORD(temp)); //绿色
  287. // t1=LOBYTE(LOWORD(temp)); //蓝色
  288. // BYTE p1,p2,p3/*,p4*/;
  289. //// p4=HIBYTE(HIWORD(tempPre)); //保留
  290. // p3=LOBYTE(HIWORD(tempPre)); //红色
  291. // p2=HIBYTE(LOWORD(tempPre)); //绿色
  292. // p1=LOBYTE(LOWORD(tempPre)); //蓝色
  293. //
  294. // if(abs((UINT)t1-(UINT)p1)<=20&&abs((UINT)t2-(UINT)p2)<=20&&
  295. // abs((UINT)t3-(UINT)p3)<=20)
  296. // {
  297. // //do nothing;
  298. // }
  299. // else
  300. // {
  301. // //出现一行的颜色变化幅度非常大,则认为此行为非分割线条
  302. // nDiff++;
  303. // if(nDiff>=10)
  304. // {
  305. // if(nSameColorLineX==3&&nTop==-1)
  306. // {
  307. // //处于top位置
  308. // nTop=y;
  309. // }
  310. // bNewBegin=TRUE;
  311. // break;
  312. // //此行无需再比较,直接跳出;
  313. // }
  314. // }
  315. // tempPre=temp;
  316. // }
  317. //
  318. // if(x>=nPosX)
  319. // {
  320. // //刚刚经历了分割线条
  321. // if(bNewBegin==TRUE)
  322. // {
  323. // nSameColorLineX++;
  324. // if(nSameColorLineX==4&&nBottom==-1)
  325. // {
  326. // //记录下下限位置
  327. // nBottom=y-1;
  328. // }
  329. // bNewBegin=FALSE;
  330. // }
  331. // }
  332. // }
  333. //
  334. int nTop,nBottom;
  335. //卡通场的数据;
  336. if(m_bSmall==TRUE)
  337. {
  338. nTop=186;
  339. nBottom=471;
  340. }
  341. else
  342. {
  343. nTop=192;
  344. nBottom=639;
  345. }
  346. LONG *pData2=new LONG[nPosX*(nBottom-nTop+1)];
  347. memcpy(pData2,&pData[nTop*nPosX],nPosX*4*(nBottom-nTop+1));
  348. delete []pData1;
  349. m_nTop=nTop;
  350. m_nBottom=nBottom;
  351. BITMAPINFO bih={0};
  352. bih.bmiHeader.biBitCount=bmp.bmBitsPixel;
  353. bih.bmiHeader.biCompression=BI_RGB;
  354. bih.bmiHeader.biHeight=-nBottom+nTop-1;
  355. bih.bmiHeader.biPlanes=1;
  356. bih.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
  357. bih.bmiHeader.biWidth=nPosX;
  358. bih.bmiHeader.biSizeImage=bih.bmiHeader.biWidth*bih.bmiHeader.biHeight*4;
  359. CClientDC dc(NULL); 
  360. HBITMAP hBitmap;
  361. hBitmap=CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER *)&bih,
  362. CBM_INIT,(VOID *)pData2,&bih,DIB_RGB_COLORS);
  363. m_bpPicture1.Attach(hBitmap);
  364. delete []pData2;
  365. return TRUE;
  366. }
  367. BOOL CQQBitmap::DividPictureH()
  368. {
  369. //垂直分割图片,以m_bpPicture1为蓝本,结果保存到m_bpPicture1,2中
  370. int p1Left,p1Right,p2Left,p2Right;
  371. if(m_bSmall==FALSE)
  372. {
  373. p1Left=8;
  374. p1Right=504;
  375. p2Left=517;
  376. p2Right=1013;
  377. }
  378. else
  379. {
  380. p1Left=10;
  381. p1Right=390;
  382. p2Left=403;
  383. p2Right=783;
  384. }
  385. m_nP1Right=p1Right;
  386. m_nP1Left=p1Left;
  387. m_nP2Left=p2Left;
  388. BITMAP bmp;
  389. m_bpPicture1.GetBitmap(&bmp);
  390. int nPosX=bmp.bmWidthBytes;
  391. int nPosY=bmp.bmHeight;
  392. BYTE *pData1=new BYTE[nPosX*nPosY];
  393. m_bpPicture1.GetBitmapBits(bmp.bmWidthBytes * bmp.bmHeight,(LPVOID)pData1);
  394. LONG *pData=(LONG*)pData1;
  395. ASSERT(nPosX%4==0);
  396. nPosX/=4;
  397. LONG *pTempData=new LONG[bmp.bmHeight*(p1Right-p1Left+1)];
  398. for(int j=0;j<bmp.bmHeight;j++)
  399. {
  400. for(int i=p1Left;i<=p1Right;i++)
  401. {
  402. pTempData[j*(p1Right-p1Left+1)+i-p1Left]=pData[j*nPosX+i];
  403. }
  404. }
  405. BITMAPINFO bih={0};
  406. bih.bmiHeader.biBitCount=bmp.bmBitsPixel;
  407. bih.bmiHeader.biCompression=BI_RGB;
  408. bih.bmiHeader.biHeight=-bmp.bmHeight;
  409. bih.bmiHeader.biPlanes=1;
  410. bih.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
  411. bih.bmiHeader.biWidth=p1Right-p1Left+1;
  412. bih.bmiHeader.biSizeImage=bih.bmiHeader.biWidth*bih.bmiHeader.biHeight*4;
  413. CClientDC dc(NULL); 
  414. HBITMAP hBitmap;
  415. hBitmap=CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER *)&bih,
  416. CBM_INIT,(VOID *)pTempData,&bih,DIB_RGB_COLORS);
  417. m_bpPicture1.Detach();
  418. m_bpPicture1.Attach(hBitmap);
  419. for(j=0;j<bmp.bmHeight;j++)
  420. {
  421. for(int i=p2Left;i<=p2Right;i++)
  422. {
  423. pTempData[j*(p2Right-p2Left+1)+i-p2Left]=pData[j*nPosX+i];
  424. }
  425. }
  426. bih.bmiHeader.biWidth=p2Right-p2Left+1;
  427. bih.bmiHeader.biSizeImage=bih.bmiHeader.biWidth*bih.bmiHeader.biHeight*4;
  428. hBitmap=CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER *)&bih,
  429. CBM_INIT,(VOID *)pTempData,&bih,DIB_RGB_COLORS);
  430. m_bpPicture2.Attach(hBitmap);
  431. delete []pTempData;
  432. delete []pData1;
  433. return TRUE;
  434. }
  435. //void CQQBitmap::GetHLine(int &p1Left,int &p1Right,int &p2Left,int &p2Right)
  436. //{
  437. // BITMAP bmp;
  438. // m_bpPicture1.GetBitmap(&bmp);
  439. // int nPosX=bmp.bmWidthBytes;
  440. // int nPosY=bmp.bmHeight;
  441. // BYTE *pData1=new BYTE[nPosX*nPosY];
  442. // m_bpPicture1.GetBitmapBits(bmp.bmWidthBytes * bmp.bmHeight,(LPVOID)pData1);
  443. //
  444. // LONG *pData=(LONG*)pData1;
  445. // ASSERT(nPosX%4==0);
  446. // nPosX/=4;
  447. //
  448. // for(int i=0;i<nPosY;i++)
  449. // {
  450. // for(int j=0;j<nPosX;j++)
  451. // {
  452. // LONG temp=pData[i*nPosX+j];
  453. // BYTE t4,t3,t2,t1;
  454. // t4=HIBYTE(HIWORD(temp)); //保留
  455. // t3=LOBYTE(HIWORD(temp)); //红色
  456. // t2=HIBYTE(LOWORD(temp)); //绿色
  457. // t1=LOBYTE(LOWORD(temp)); //蓝色
  458. //
  459. // if(t1>=110&&t2>=110&&t3>=110)
  460. // {
  461. // pData[i*nPosX+j]=255|255<<8|255<<16|255<<24;
  462. // }
  463. // else
  464. // {
  465. // pData[i*nPosX+j]=0|0<<8|0<<16|0<<24;
  466. // }
  467. // }
  468. // }
  469. //
  470. // m_bpPicture1.SetBitmapBits(bmp.bmWidthBytes * bmp.bmHeight,pData1);
  471. // PrintBitmapToFile("测试1.bmp",TRUE);
  472. //
  473. // int x,y;
  474. // int nGet=1;
  475. // BOOL bInGet=FALSE;
  476. // for(x=0;x<nPosX;x++)
  477. // {
  478. // int nBlack=0;
  479. // for(y=0;y<nPosY;y++)
  480. // {
  481. // LONG temp1=pData[y*nPosX+x];
  482. // if(temp1==(0|0<<8|0<<16|0<<24))
  483. // {
  484. // //出现黑色点超过十个,认为不是垂直线条区域,直接跳出
  485. // if(++nBlack>=10)
  486. // {
  487. // if(bInGet==TRUE)
  488. // {
  489. // bInGet=FALSE;
  490. // nGet++;
  491. // }
  492. // break;
  493. // }
  494. // }
  495. // }
  496. //
  497. // if(y>=nPosY)
  498. // {
  499. // //出现了第一条线全都是白色的列线条
  500. // if(nGet==1)
  501. // {
  502. // bInGet=TRUE;
  503. // p1Left=x;
  504. // }
  505. // else if(nGet==2)
  506. // {
  507. // //出现第二条白线
  508. // p1Right=x;
  509. // nGet++;
  510. // }
  511. // else if(nGet==3)
  512. // {
  513. // p2Left=x;
  514. // bInGet=TRUE;
  515. // }
  516. // else if(nGet==4)
  517. // {
  518. // p2Right=x;
  519. // break;
  520. // }
  521. // }
  522. // }
  523. //
  524. // delete []pData1;
  525. // p1Left++;
  526. // p1Right--;
  527. // p2Left++;
  528. // p2Right--;
  529. // ASSERT(p1Right-p1Left==p2Right-p2Left);
  530. //}
  531. void CQQBitmap::FindDifferent()
  532. {
  533. BITMAP bmp;
  534. m_bpPicture1.GetBitmap(&bmp);
  535. int nPosX=bmp.bmWidthBytes;
  536. int nPosY=bmp.bmHeight;
  537. BYTE *pDataX=new BYTE[nPosX*nPosY];
  538. m_bpPicture1.GetBitmapBits(bmp.bmWidthBytes * bmp.bmHeight,(LPVOID)pDataX);
  539. LONG *pData1=(LONG*)pDataX;
  540. BYTE *pDataY=new BYTE[nPosX*nPosY];
  541. m_bpPicture2.GetBitmap(&bmp);
  542. ASSERT((nPosX==bmp.bmWidthBytes)&&(nPosY==bmp.bmHeight));
  543. m_bpPicture2.GetBitmapBits(bmp.bmWidthBytes * bmp.bmHeight,(LPVOID)pDataY);
  544. LONG *pData2=(LONG*)pDataY;
  545. ASSERT(nPosX%4==0);
  546. nPosX/=4;
  547. int x,y;
  548. for(y=0;y<nPosY;y++)
  549. {
  550. for(x=0;x<nPosX;x++)
  551. {
  552. int n=m_arrayDifRect.GetSize();
  553. POINT ptTemp;
  554. ptTemp.x=x;
  555. ptTemp.y=y;
  556. while(n)
  557. {
  558. n--;
  559. RECT rcTemp=m_arrayDifRect.GetAt(n);
  560. rcTemp.left=rcTemp.left-6>0?rcTemp.left-6:0;
  561. rcTemp.right+=6;
  562. rcTemp.top=rcTemp.top-6>0?rcTemp.top-6:0;;
  563. rcTemp.bottom+=6;
  564. if(PtInRect(&rcTemp,ptTemp)==TRUE)
  565. {
  566. break;
  567. }
  568. }
  569. if(n>0)
  570. {
  571. continue;
  572. }
  573. if(pData2[y*nPosX+x]!=pData1[y*nPosX+x])
  574. {
  575. //向右寻找,直到连续五个像素都相同,则认为为右边界
  576. int nRight,nBottom,nFlag=0;
  577. for(nRight=x+1;nRight<nPosX;nRight++)
  578. {
  579. if(pData2[y*nPosX+nRight]==pData1[y*nPosX+nRight])
  580. {
  581. nFlag++;
  582. if(nFlag>=5)
  583. {
  584. break;
  585. }
  586. }
  587. else
  588. {
  589. nFlag=0;
  590. }
  591. }
  592. if(nFlag<5)
  593. {
  594. //nRight到达右极限
  595. nRight=nPosX-1-nFlag;
  596. }
  597. else
  598. {
  599. //达到五个像素连续相同的条件
  600. nRight=nRight-5;
  601. }
  602. //向下寻找,知道连续个像素都相同,则认为为下边界
  603. nFlag=0;
  604. for(nBottom=y+1;nBottom<nPosY;nBottom++)
  605. {
  606. if(pData2[nBottom*nPosX+x]==pData1[nBottom*nPosX+x])
  607. {
  608. nFlag++;
  609. if(nFlag>=5)
  610. {
  611. break;
  612. }
  613. }
  614. else
  615. {
  616. nFlag=0;
  617. }
  618. }
  619. if(nFlag<5)
  620. {
  621. //nRight到达右极限
  622. nBottom=nPosY-1-nFlag;
  623. }
  624. else
  625. {
  626. //达到五个像素连续相同的条件
  627. nBottom=nBottom-5;
  628. }
  629. RECT rcTemp;
  630. rcTemp.left=x;
  631. rcTemp.top=y;
  632. rcTemp.right=nRight;
  633. rcTemp.bottom=nBottom;
  634. m_arrayDifRect.Add(rcTemp);
  635. x=nRight;
  636. }
  637. }
  638. }
  639. int nCount=m_arrayDifRect.GetSize();
  640. int i=0;
  641. //#ifdef _DEBUG
  642. // while(i<nCount)
  643. // {
  644. // //调整坐标位置为相对于窗体的位置
  645. // RECT rcTemp=m_arrayDifRect.GetAt(i);
  646. // rcTemp.left+=m_nP1Left;
  647. // rcTemp.right+=m_nP1Left;
  648. // rcTemp.top+=m_nTop;
  649. // rcTemp.bottom+=m_nTop;
  650. // m_arrayDifRect.RemoveAt(i);
  651. // m_arrayDifRect.InsertAt(i,rcTemp);
  652. // i++;
  653. // }
  654. //#endif
  655. while(i<nCount)
  656. {
  657. RECT rcTemp=m_arrayDifRect.GetAt(i);
  658. m_arrayDifRect.RemoveAt(i);
  659. if(rcTemp.right-rcTemp.left<=6||rcTemp.bottom-rcTemp.top<=6)
  660. {
  661. nCount--;
  662. }
  663. else
  664. {
  665. m_arrayDifRect.InsertAt(i,rcTemp);
  666. i++;
  667. }
  668. }
  669. HDC hdcMem;
  670. CDC MemDC;
  671. CClientDC dc(NULL);
  672. hdcMem=CreateCompatibleDC(dc.m_hDC); //?????hdc?????dc
  673. MemDC.Attach(hdcMem);//?hdcMem?pMemDC????
  674. m_bpAllPicture.GetBitmap(&bmp);
  675. nPosX=bmp.bmWidthBytes;
  676. nPosY=bmp.bmHeight;
  677. CBitmap *pOldBitmap=MemDC.SelectObject(&m_bpAllPicture); //?????hdcMem,???hdcMem???????????dc?.
  678. CBrush *pOldBrush=(CBrush *)MemDC.SelectStockObject(NULL_BRUSH);
  679. CPen pen;
  680. pen.CreatePen(PS_SOLID,3,RGB(255,0,0));
  681. CPen *pOldPen=(CPen *)MemDC.SelectObject(&pen);
  682. nCount=m_arrayDifRect.GetSize();
  683. i=0;
  684. while(i<nCount)
  685. {
  686. RECT rcTemp;
  687. rcTemp=m_arrayDifRect.GetAt(i);
  688. MemDC.Ellipse(&rcTemp);
  689. i++;
  690. }
  691. MemDC.SelectObject(pOldPen);
  692. MemDC.SelectObject(pOldBrush);
  693. MemDC.SelectObject(pOldBitmap);
  694. PrintBitmapToFile("QQ游戏.bmp",TRUE);
  695. delete []pDataX;
  696. delete []pDataY;
  697. }
  698. void CQQBitmap::CheckStyle()
  699. {
  700. BITMAP bmp;
  701. m_bpAllPicture.GetBitmap(&bmp);
  702. if(bmp.bmHeight>=700&&bmp.bmWidth>=1000)
  703. {
  704. //美女场
  705. m_bSmall=FALSE;
  706. }
  707. else
  708. {
  709. //卡通场
  710. m_bSmall=TRUE;
  711. }
  712. }
  713. void CQQBitmap::GetDiffRects(CArray<RECT,RECT> &array)
  714. {
  715. int nCount=m_arrayDifRect.GetSize();
  716. int i=0;
  717. for(i=0;i<nCount;i++)
  718. {
  719. RECT rcTemp;
  720. rcTemp=m_arrayDifRect.GetAt(i);
  721. array.Add(rcTemp);
  722. }
  723. }
  724. void CQQBitmap::GetPicture1Rect(RECT &rcP1)
  725. {
  726. rcP1.left=m_nP1Left;
  727. rcP1.right=m_nP1Right;
  728. rcP1.top=m_nTop;
  729. rcP1.bottom=m_nBottom;
  730. }