ImageProcessBHO.cpp
上传用户:pass2008
上传日期:2021-07-05
资源大小:3299k
文件大小:9k
源码类别:

Internet/IE编程

开发平台:

Visual C++

  1. // ImageProcessBHO.cpp : CImageProcessBHO 的实现
  2. #include "stdafx.h"
  3. #include "ImageProcessBHO.h"
  4. #include <stdio.h>
  5. #include "ImgProcUnit.h"
  6. // CImageProcessBHO
  7. STDMETHODIMP CImageProcessBHO::SetSite(IUnknown* pUnkSite)
  8. {
  9. if(pUnkSite!=NULL)
  10. {
  11. //缓存指向IWebBrowser2的指针。
  12. HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void**)&m_spWebBrowser);
  13. if(SUCCEEDED(hr))
  14. {
  15. //注册事件
  16. hr = DispEventAdvise(m_spWebBrowser);
  17. if(SUCCEEDED(hr))
  18. {
  19. m_fAdvised=TRUE;
  20. }
  21. }
  22. }
  23. else
  24. {
  25. //取消注册事件。
  26. if(m_fAdvised)
  27. {
  28. DispEventUnadvise(m_spWebBrowser);
  29. m_fAdvised = FALSE;
  30. }
  31. //在此释放缓存的指针和其他资源。
  32. m_spWebBrowser.Release();
  33. }
  34. //返回基类实现
  35. return IObjectWithSiteImpl::SetSite(pUnkSite);
  36. }
  37. void STDMETHODCALLTYPE CImageProcessBHO::OnDocumentComplete(IDispatch* pDisp, VARIANT* pvarURL)
  38. {
  39. HRESULT hr = S_OK;
  40. CComQIPtr<IWebBrowser2> spTempWebBrowser = pDisp;
  41. if(spTempWebBrowser 
  42. && m_spWebBrowser 
  43. && m_spWebBrowser.IsEqualObject(spTempWebBrowser))
  44. {
  45. CComPtr<IDispatch> spDispDoc;
  46. hr = m_spWebBrowser->get_Document(&spDispDoc);
  47. if(SUCCEEDED(hr))
  48. {
  49. CComQIPtr<IHTMLDocument2> spHTMLDoc = spDispDoc;
  50. if(spHTMLDoc!=NULL)
  51. {
  52. BSTR URL;
  53. spHTMLDoc->get_URL(&URL);
  54. //domainURL.Empty();
  55. domainURL = URL;
  56. // 这两种情况下就不要处理了
  57. if (domainURL == _T("about:blank") || domainURL == _T("res://ieframe.dll/tabswelcome.htm"))
  58. {
  59. return;
  60. }
  61. BSTR bstLocalHTML;
  62. if (m_bNavigatedToLocalHTML)
  63. {
  64. //spHTMLDoc->get_URL(&URL);
  65. //CString tempURL;
  66. //tempURL = URL;
  67. if (domainURL == (_T("file://")+localStockedPath))
  68. {
  69. //bstLocalHTML = localStockedPath.AllocSysString();
  70. //m_spWebBrowser->Navigate(bstLocalHTML, NULL, NULL, NULL, NULL); //转到本地保存的HTML页面
  71. //m_bNavigatedToLocalHTML = FALSE; //确保不进入死循环
  72. return;
  73. }
  74. else if (domainURL == predomainURL)
  75. {
  76. bstLocalHTML = localStockedPath.AllocSysString();
  77. m_spWebBrowser->Navigate(bstLocalHTML, NULL, NULL, NULL, NULL); //转到本地保存的HTML页面
  78. }
  79. else
  80. {
  81. localStockedPath = domainURL;
  82. elimInvalidPrefixSymbols(localStockedPath);
  83. localStockedPath = _T("C:\") + localStockedPath + _T(".htm");
  84. CFileFind tFileFind;
  85. if (!tFileFind.FindFile(localStockedPath))
  86. {
  87. ::URLDownloadToFile(NULL, domainURL, localStockedPath, 0, NULL); //保存网页,用于修改显示
  88. RetrieveImagesLinks(spHTMLDoc);
  89. JointImagesURL(); //得到图片的绝对路径
  90. //图像下载及边缘化/灰度化处理
  91. ImgProcUnit* imgProcUnit = new ImgProcUnit(imageLinks, domainURL);
  92. imgProcUnit->downloadImages(); //下载图片
  93. imgProcUnit->imageEdgeProcess(); //图像边缘化处理
  94. for (int i=0; i<imgProcUnit->imageNames.GetCount(); i++)
  95. {
  96. imageNames.Add(imgProcUnit->imageNames.GetAt(i));
  97. }
  98. //修改保存在本地的网页
  99. ModifyOriHTMLPicLinks(localStockedPath);
  100. //m_bNavigatedToLocalHTML = TRUE; //确保不进入死循环
  101. }
  102. bstLocalHTML = localStockedPath.AllocSysString();
  103. m_spWebBrowser->Navigate(bstLocalHTML, NULL, NULL, NULL, NULL); //转到本地保存的HTML页面
  104. predomainURL = domainURL;
  105. }
  106. }
  107. else
  108. {
  109. localStockedPath = domainURL;
  110. elimInvalidPrefixSymbols(localStockedPath);
  111. localStockedPath = _T("C:\") + localStockedPath + _T(".html");
  112. CFileFind tFileFind;
  113. if (!tFileFind.FindFile(localStockedPath))
  114. {
  115. ::URLDownloadToFile(NULL, domainURL, localStockedPath, 0, NULL); //保存网页,用于修改显示
  116. RetrieveImagesLinks(spHTMLDoc);
  117. JointImagesURL(); //得到图片的绝对路径
  118. //图像下载及边缘化/灰度化处理
  119. ImgProcUnit* imgProcUnit = new ImgProcUnit(imageLinks, domainURL);
  120. imgProcUnit->downloadImages(); //下载图片
  121. imgProcUnit->imageEdgeProcess(); //图像边缘化处理
  122. for (int i=0; i<imgProcUnit->imageNames.GetCount(); i++)
  123. {
  124. imageNames.Add(imgProcUnit->imageNames.GetAt(i));
  125. }
  126. //修改保存在本地的网页
  127. ModifyOriHTMLPicLinks(localStockedPath);
  128. }
  129.     bstLocalHTML = localStockedPath.AllocSysString();
  130. m_spWebBrowser->Navigate(bstLocalHTML, NULL, NULL, NULL, NULL); //转到本地保存的HTML页面
  131. predomainURL = domainURL;
  132. m_bNavigatedToLocalHTML = TRUE; //确保不进入死循环
  133. }
  134. }
  135. }
  136. }
  137. }
  138. // 获取图片的下载链接
  139. void CImageProcessBHO::RetrieveImagesLinks(IHTMLDocument2* pDocument)
  140. {
  141. CComPtr<IHTMLElementCollection> spImages;
  142. HRESULT hr = pDocument->get_images(&spImages);
  143. if(hr==S_OK && spImages!=NULL)
  144. {
  145. long cImages = 0;
  146. hr = spImages->get_length(&cImages);
  147. if(hr==S_OK && cImages>0)
  148. {
  149. for(int i=0; i<cImages; i++)
  150. {
  151. CComVariant svarItemIndex(i);
  152. CComVariant svarEmpty;
  153. CComPtr<IDispatch> spdispImage;
  154.     hr = spImages->item(svarItemIndex, svarEmpty, &spdispImage);
  155. if(hr==S_OK && spdispImage!=NULL)
  156. {
  157. CComQIPtr<IHTMLElement> spElement = spdispImage;
  158. if(spElement)
  159. {
  160. BSTR bst;
  161. spElement->get_outerHTML(&bst);
  162. CString otHTML(bst);
  163. //otHTML.MakeLower();
  164. imageLinks.Add(otHTML);
  165. }
  166. }
  167. }
  168. }
  169. }
  170. }
  171. void CImageProcessBHO::ModifyOriHTMLPicLinks(LPCTSTR htmlPath)
  172. {
  173. CFile htmlFile;
  174. if (!htmlFile.Open(htmlPath, CFile::modeReadWrite | CFile::shareExclusive))
  175. {
  176. return;
  177. }
  178. DWORD dwHtmlSize = htmlFile.GetLength();
  179. char* lpHtml = new char[dwHtmlSize+1];
  180. try
  181. {
  182. if (htmlFile.Read(lpHtml, dwHtmlSize) != dwHtmlSize)
  183. {
  184. delete[] lpHtml;
  185. lpHtml = NULL;
  186. return;
  187. }
  188. }
  189. catch (CFileException* e)
  190. {
  191. e->Delete();
  192. delete[] lpHtml;
  193. lpHtml = NULL;
  194. return;
  195. }
  196. CString procHtml(lpHtml);
  197. //procHtml.MakeLower();
  198. delete[] lpHtml;
  199. lpHtml = NULL;
  200. htmlFile.Close();
  201. //修改html文件中图片的路径,改为处理后的图片路径
  202. int index;
  203. CString temp;
  204. for (int i=0; i<imageOuterHTML.GetCount(); i++)
  205. {
  206. temp = imageOuterHTML.GetAt(i);
  207. index = procHtml.Find(temp);
  208. if (index > -1 && imageNames.GetAt(i) != _T("Download Error!"))
  209. {
  210. //replaceIExplorerImgOuterHTML(temp, imageNames.GetAt(i));
  211. procHtml.Replace(imageOuterHTML.GetAt(i), imageNames.GetAt(i));
  212. }
  213. }
  214. LPTSTR lpNewHtml = procHtml.GetBuffer(procHtml.GetLength()+1);
  215. if (!htmlFile.Open(htmlPath, CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive))
  216. {
  217. return;
  218. }
  219. htmlFile.Write(lpNewHtml, procHtml.GetLength()+1);
  220. htmlFile.Close();
  221. }
  222. //对于没有给出绝对路径的链接补全其路径
  223. void CImageProcessBHO::JointImagesURL()
  224. {
  225. if (imageLinks.GetCount()>0)
  226. {
  227. //int count = 0;
  228. int cImages = imageLinks.GetCount();
  229. CString temp;
  230. CString src("src="");
  231. CString http("http:");
  232. for (int i=0; i<cImages; i++)
  233. {
  234. temp = imageLinks.GetAt(i);
  235. //获得src中的内容,可能是绝对路径也可能是相对路径
  236. temp = GetImgSrc(temp, src);
  237. imageOuterHTML.Add(temp);
  238. //匹配"http:"检查图片是否是绝对路径
  239. if (simpleMatch(temp, http))
  240. {
  241. imageLinks.SetAt(i, temp);
  242. }
  243. else
  244. {
  245. //添加域名路径合成绝对路径
  246. synFullURLPath(i, temp);
  247. }
  248. }
  249. }
  250. }
  251. CString CImageProcessBHO::GetImgSrc(CString& linkInfo, CString& strImgSrc)
  252. {
  253. CString imgSrc = _T("");
  254. int v1 = linkInfo.GetLength();
  255. int v2 = strImgSrc.GetLength();
  256. int i = 0, j = 0;
  257. while (i<v1-v2 && j<v2)
  258. {
  259. if (strImgSrc.GetAt(j) == linkInfo.GetAt(i+j))
  260. {
  261. j++;
  262. }
  263. else
  264. {
  265. j = 0;
  266. i++;
  267. }
  268. }
  269. if (j == v2)
  270. {
  271. CString temp(_T(""));
  272. temp = linkInfo.Right(v1-(i+j));
  273. int endInfo = temp.Find('"');
  274. temp = temp.Left(endInfo);
  275. imgSrc = temp;
  276. }
  277. return imgSrc;
  278. }
  279. BOOL CImageProcessBHO::simpleMatch(CString& linkInfo, CString& strHttp)
  280. {
  281. int v1 = linkInfo.GetLength();
  282. int v2 = strHttp.GetLength();
  283. int i = 0, j = 0;
  284. while (i<v1-v2 && j<v2)
  285. {
  286. if (strHttp.GetAt(j) == linkInfo.GetAt(i+j))
  287. {
  288. j++;
  289. }
  290. else
  291. {
  292. j = 0;
  293. i++;
  294. }
  295. }
  296. if (j == v2)
  297. {
  298. return TRUE;
  299. }
  300. return FALSE;
  301. }
  302. void CImageProcessBHO::synFullURLPath(int index, CString& subStrLink)
  303. {
  304. int len = domainURL.GetLength();
  305. CString temp = domainURL.Left(len-1);
  306. temp += subStrLink;
  307. imageLinks.SetAt(index, temp);
  308. }
  309. /*
  310. void CImageProcessBHO::replaceIExplorerImgOuterHTML(CString& strOtHTML, LPCTSTR imgPath)
  311. {
  312. CString imgLinkURL(strOtHTML);
  313. CString src("src="");
  314. int len = imgLinkURL.GetLength();
  315. int matchLen = src.GetLength();
  316. int index = imgLinkURL.Find(src);
  317. imgLinkURL = imgLinkURL.Right(len-index-matchLen);
  318. index = imgLinkURL.Find(""");
  319. imgLinkURL = imgLinkURL.Left(index);
  320. CString temp;
  321. temp.Format(imgPath);
  322. strOtHTML.Replace(imgLinkURL, temp);
  323. }*/
  324. BOOL CImageProcessBHO::elimInvalidPrefixSymbols(CString& strPrefix)
  325. {
  326. strPrefix.Remove('\');
  327. strPrefix.Remove('/');
  328. strPrefix.Remove(':');
  329. strPrefix.Remove('*');
  330. strPrefix.Remove('?');
  331. strPrefix.Remove('"');
  332. strPrefix.Remove('<');
  333. strPrefix.Remove('>');
  334. strPrefix.Remove('|');
  335. strPrefix.Remove('.');
  336. strPrefix.Remove('_');
  337. strPrefix.Remove('-');
  338. return TRUE;
  339. }