GuessWidth.cpp
上传用户:gzboli
上传日期:2013-04-10
资源大小:471k
文件大小:9k
源码类别:

图片显示

开发平台:

Visual C++

  1. // WidthCor.cpp: implementation of the CGuessWidth class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "GuessWidth.h"
  6. #include <math.h>
  7. //#include <LIMITS.H>
  8. #include <FLOAT.H>
  9. #ifdef _DEBUG
  10. #undef THIS_FILE
  11. static char THIS_FILE[]=__FILE__;
  12. #define new DEBUG_NEW
  13. #endif
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. CGuessWidth::CGuessWidth()
  18. {
  19. // m_iMinWidth=100;
  20. // m_iMaxWidth=6000;
  21. // m_iWidth=m_iHeight=-1;
  22. }
  23. CGuessWidth::~CGuessWidth()
  24. {
  25. }
  26. double CGuessWidth::WidthDetect(DWORD &iWidth,DWORD &iHeight,LPCTSTR lpszFile, short iBytes, DWORD wHeaderSize)
  27. {
  28. ASSERT(NULL != lpszFile);
  29. char *pExt=strrchr(lpszFile,'.');
  30. char cExt[10];
  31. strcpy(cExt,++pExt);
  32. _strlwr(cExt);
  33. if(strcmp(cExt,"cpx")==0)
  34. {
  35. // return FindWidth(iWidth,iHeight,lpszFile,(short)sizeof(short));
  36. return CPXDetect(iWidth, iHeight, lpszFile);
  37. }
  38. else if(strcmp(cExt,"raw")==0)
  39. {
  40. return FindWidth(iWidth, iHeight, lpszFile, (BYTE)sizeof(BYTE));
  41. }
  42. else if(strcmp(cExt,"int")==0)
  43. {
  44. return FindWidth(iWidth, iHeight, lpszFile, (float)sizeof(float), wHeaderSize);
  45. }
  46. else
  47. {
  48. return -1.0;
  49. }
  50. }
  51. double CGuessWidth::CPXDetect(DWORD &iWidth,DWORD &iHeight,LPCTSTR lpszFile)
  52. {
  53. CFile f;
  54. if(!f.Open(lpszFile,CFile::modeRead | CFile::shareExclusive))
  55. {
  56. return -1.0;
  57. }
  58. DWORD filesize=f.GetLength();
  59. iWidth = (DWORD)sqrt(filesize);
  60. DWORD iMaxLength, iMinLength;
  61. iMaxLength = (filesize/100) > (iWidth*100) ? iWidth*100 : filesize/100;
  62. iMinLength = iMaxLength / 100;
  63. HANDLE hHeap=NULL;
  64. short *pByte1=NULL;
  65. short *pByte2=NULL;
  66. hHeap=HeapCreate(HEAP_NO_SERIALIZE,iMaxLength*sizeof(short)*4,0);
  67. if(hHeap==NULL)
  68. {
  69. return -1.0;
  70. }
  71. HeapLock(hHeap);
  72. pByte1=(short*)HeapAlloc(hHeap , HEAP_NO_SERIALIZE , iMaxLength*sizeof(short)*2);
  73. if(pByte1==NULL)
  74. {
  75. HeapUnlock(hHeap);
  76. HeapDestroy(hHeap);
  77. return -1.0;
  78. }
  79. pByte2=(short*)HeapAlloc(hHeap , HEAP_NO_SERIALIZE , iMaxLength*sizeof(short)*2);
  80. if(pByte2==NULL)
  81. {
  82. HeapFree(hHeap,HEAP_NO_SERIALIZE,pByte1);
  83. HeapUnlock(hHeap);
  84. HeapDestroy(hHeap);
  85. return -1.0;
  86. }
  87. DWORD wMax=iWidth;
  88. double dMax=-1.0;
  89. double dTemp;
  90. int k;
  91. short iReal,iVirtual;
  92. double dGray1,dGray2;
  93. DWORD i, j;
  94. double iG1G2,iG12,iG22;
  95. DWORD wRowSize, iSkip;;
  96. for(i=iWidth; i<iMaxLength; i++)
  97. {
  98. wRowSize = i * sizeof(short) * 2;
  99. if((filesize % wRowSize) == 0)
  100. {
  101. iSkip = filesize/wRowSize/6;
  102. if(iSkip == 0) iSkip = 1;
  103. iG1G2=iG12=iG22=0.0;
  104. for(k=1;k<6;k++)
  105. {
  106. f.Seek(k * iSkip * wRowSize, CFile::begin);
  107. f.Read(pByte1, wRowSize);
  108. f.Read(pByte2, wRowSize);
  109. for(j=0;j<i;j++)
  110. {
  111. iReal = pByte1[2*j];
  112. iVirtual = pByte1[2*j+1];
  113. dGray1 = (sqrt((double)iReal*iReal + (double)iVirtual*iVirtual)/i);
  114. iReal = pByte2[2*j];
  115. iVirtual = pByte2[2*j+1];
  116. dGray2 = (sqrt((double)iReal*iReal + (double)iVirtual*iVirtual)/i);
  117. iG1G2 += dGray1*dGray2;
  118. iG12 += dGray1*dGray1;
  119. iG22 += dGray2*dGray2;
  120. }
  121. if((dTemp = iG1G2/iG12*iG1G2/iG22) > dMax)
  122. {
  123. dMax=dTemp;
  124. wMax=i;
  125. }
  126. }
  127. }
  128. }
  129. for(i=iWidth-1; i>iMinLength; i--)
  130. {
  131. wRowSize = i * sizeof(short) * 2;
  132. if((filesize % wRowSize) == 0)
  133. {
  134. iSkip = filesize/wRowSize/6;
  135. if(iSkip == 0) iSkip = 1;
  136. iG1G2=iG12=iG22=0.0;
  137. for(k=1;k<6;k++)
  138. {
  139. f.Seek(k * iSkip * wRowSize, CFile::begin);
  140. f.Read(pByte1, wRowSize);
  141. f.Read(pByte2, wRowSize);
  142. for(j=0;j<i;j++)
  143. {
  144. iReal = pByte1[2*j];
  145. iVirtual = pByte1[2*j+1];
  146. dGray1 = (sqrt((double)iReal*iReal + (double)iVirtual*iVirtual)/i);
  147. iReal = pByte2[2*j];
  148. iVirtual = pByte2[2*j+1];
  149. dGray2 = (sqrt((double)iReal*iReal + (double)iVirtual*iVirtual)/i);
  150. iG1G2 += dGray1*dGray2;
  151. iG12 += dGray1*dGray1;
  152. iG22 += dGray2*dGray2;
  153. }
  154. if((dTemp = iG1G2/iG12*iG1G2/iG22) > dMax)
  155. {
  156. dMax=dTemp;
  157. wMax=i;
  158. }
  159. }
  160. }
  161. }
  162. f.Close();
  163. try
  164. {
  165. HeapFree(hHeap,HEAP_GENERATE_EXCEPTIONS,pByte1);
  166. HeapFree(hHeap,HEAP_GENERATE_EXCEPTIONS,pByte2);
  167. HeapUnlock(hHeap);
  168. HeapDestroy(hHeap);
  169. }
  170. catch(CMemoryException *e)
  171. {
  172. char msg[256];
  173. e->GetErrorMessage(msg,255);
  174. e->ReportError();
  175. e->Delete();
  176. return -0.1;
  177. }
  178. iWidth=wMax;
  179. iHeight=filesize/iWidth/sizeof(DWORD);
  180. return dMax;
  181. }
  182. template <class T> double CGuessWidth::FindWidth
  183. (DWORD &iWidth,DWORD &iHeight,LPCTSTR lpszFile,T iDepth, DWORD wHeaderSize)
  184. //double CGuessWidth::FindWidth
  185. // (DWORD &iWidth,DWORD &iHeight,LPCTSTR lpszFile,BYTE iDepth)
  186. {
  187. CFile f;
  188. if(!f.Open(lpszFile,CFile::modeRead | CFile::shareExclusive))
  189. {
  190. return -1.0;
  191. }
  192. const DWORD filesize = f.GetLength() - wHeaderSize;
  193. iWidth = (DWORD)sqrt(filesize);
  194. DWORD iMaxLength, iMinLength;
  195. iMaxLength = (filesize/100) > (iWidth*100) ? iWidth*100 : filesize/100;
  196. iMinLength = iMaxLength / 100;
  197. HANDLE hHeap=NULL;
  198. T *pByte1=NULL;
  199. T *pByte2=NULL;
  200. HGLOBAL hByte1 = NULL;
  201. HGLOBAL hByte2 = NULL;
  202. hByte1 = GlobalAlloc(GHND, iMaxLength * sizeof(T));
  203. if(hByte1==NULL)
  204. {
  205. return -1.0;
  206. }
  207. hByte2 = GlobalAlloc(GHND, iMaxLength * sizeof(T));
  208. if(hByte2==NULL)
  209. {
  210. GlobalFree(hByte1);
  211. return -1.0;
  212. }
  213. pByte1 = (T*)GlobalLock(hByte1);
  214. if(pByte1 == NULL)
  215. {
  216. GlobalFree(hByte1);
  217. GlobalFree(hByte2);
  218. return -1.0;
  219. }
  220. pByte2 = (T*)GlobalLock(hByte2);
  221. if(pByte2 == NULL)
  222. {
  223. GlobalUnlock(hByte1);
  224. GlobalFree(hByte1);
  225. GlobalFree(hByte2);
  226. return -1.0;
  227. }
  228. DWORD wMax = iWidth;
  229. double dMax = -FLT_MAX;
  230. double dTemp;
  231. int k;
  232. DWORD i, j;
  233. double iG1G2, iG12, iG22;
  234. int iSkip;
  235. for(i = iWidth; i < iMaxLength; i++)
  236. {
  237. if((filesize % i) == 0)
  238. {
  239. iSkip = filesize/i/6;
  240. if(iSkip == 0) iSkip = 1;
  241. iG1G2=iG12=iG22=0.0;
  242. for(k=1;k<6;k++)
  243. {
  244. f.Seek(k * iSkip * i * sizeof(T), CFile::begin);
  245. f.Read(pByte1, i * sizeof(T));
  246. f.Read(pByte2, i * sizeof(T));
  247. for(j=0;j<i;j++)
  248. {
  249. iG1G2 += ((double)pByte1[j]*pByte2[j] / i);
  250. iG12 += ((double)pByte1[j]*pByte1[j] / i);
  251. iG22 += ((double)pByte2[j]*pByte2[j] / i);
  252. }
  253. }
  254. if((dTemp = iG1G2/iG12*iG1G2/iG22) > dMax)
  255. {
  256. dMax=dTemp;
  257. wMax=i;
  258. }
  259. }
  260. }
  261. for(i=iWidth-1; i>iMinLength; i--)
  262. {
  263. if((filesize % i) == 0)
  264. {
  265. iSkip = filesize/i/6;
  266. if(iSkip == 0) iSkip = 1;
  267. iG1G2=iG12=iG22=0.0;
  268. for(k=1;k<6;k++)
  269. {
  270. f.Seek(k * iSkip * i * sizeof(T), CFile::begin);
  271. f.Read(pByte1, i * sizeof(T));
  272. f.Read(pByte2, i * sizeof(T));
  273. for(j=0;j<i;j++)
  274. {
  275. iG1G2 += ((double)pByte1[j]*pByte2[j] / i);
  276. iG12 += ((double)pByte1[j]*pByte1[j] / i);
  277. iG22 += ((double)pByte2[j]*pByte2[j] / i);
  278. }
  279. }
  280. if((dTemp = iG1G2/iG12*iG1G2/iG22) > dMax)
  281. {
  282. dMax=dTemp;
  283. wMax=i;
  284. }
  285. }
  286. }
  287. f.Close();
  288. GlobalUnlock(hByte1);
  289. GlobalFree(hByte1);
  290. GlobalUnlock(hByte2);
  291. GlobalFree(hByte2);
  292. iWidth=wMax;
  293. iHeight=filesize / iWidth / int(iDepth + 0.5);
  294. return dMax;
  295. }
  296. /*
  297. double CGuessWidth::FindWidth(DWORD &iWidth,DWORD &iHeight,LPCTSTR lpszFile,BYTE iDepth)
  298. {
  299. CFile f;
  300. if(!f.Open(lpszFile,CFile::modeRead | CFile::shareExclusive))
  301. {
  302. return -1.0;
  303. }
  304. DWORD filesize=f.GetLength();
  305. if(m_iMaxWidth > filesize)
  306. {
  307. m_iMaxWidth = filesize;
  308. }
  309. int iCount=filesize/m_iMaxWidth/10/iDepth;
  310. if(iCount==0)
  311. {
  312. iCount=1;
  313. }
  314. HANDLE hHeap=NULL;
  315. BYTE *pByte1=NULL;
  316. BYTE *pByte2=NULL;
  317. hHeap=HeapCreate(HEAP_NO_SERIALIZE,m_iMaxWidth*sizeof(BYTE)*2,0);
  318. if(hHeap==NULL)
  319. {
  320. return -1.0;
  321. }
  322. HeapLock(hHeap);
  323. pByte1=(BYTE*)HeapAlloc(hHeap , HEAP_NO_SERIALIZE , m_iMaxWidth*sizeof(BYTE));
  324. if(pByte1==NULL)
  325. {
  326. HeapUnlock(hHeap);
  327. HeapDestroy(hHeap);
  328. return -1.0;
  329. }
  330. pByte2=(BYTE*)HeapAlloc(hHeap , HEAP_NO_SERIALIZE , m_iMaxWidth*sizeof(BYTE));
  331. if(pByte2==NULL)
  332. {
  333. HeapFree(hHeap,HEAP_NO_SERIALIZE,pByte1);
  334. HeapUnlock(hHeap);
  335. HeapDestroy(hHeap);
  336. return -1.0;
  337. }
  338. DWORD wMax=m_iMinWidth;
  339. double dMax=-FLT_MAX;
  340. double dTemp;
  341. int k;
  342. DWORD j;
  343. double iG1G2,iG12,iG22;
  344. for(k=1;k<6;k++)
  345. {
  346. for(DWORD i=m_iMinWidth;i<m_iMaxWidth;i++)
  347. {
  348. if((filesize % i) != 0)continue;
  349. f.Seek(k*iCount*i*sizeof(BYTE),CFile::begin);
  350. f.Read(pByte1,i*sizeof(BYTE));
  351. f.Read(pByte2,i*sizeof(BYTE));
  352. iG1G2=iG12=iG22=0.0;
  353. for(j=0;j<i;j++)
  354. {
  355. iG1G2+=(double)pByte1[i]*pByte2[i];
  356. iG12+=(double)pByte1[i]*pByte1[i];
  357. iG22+=(double)pByte2[i]*pByte2[i];
  358. }
  359. if((dTemp = iG1G2/iG12*iG1G2/iG22) > dMax)
  360. {
  361. dMax=dTemp;
  362. wMax=i;
  363. }
  364. }
  365. }
  366. f.Close();
  367. try
  368. {
  369. HeapFree(hHeap,HEAP_GENERATE_EXCEPTIONS,pByte1);
  370. HeapFree(hHeap,HEAP_GENERATE_EXCEPTIONS,pByte2);
  371. HeapUnlock(hHeap);
  372. HeapDestroy(hHeap);
  373. }
  374. catch(CMemoryException *e)
  375. {
  376. char msg[256];
  377. e->GetErrorMessage(msg,255);
  378. e->ReportError();
  379. e->Delete();
  380. return -0.1;
  381. }
  382. iWidth=wMax;
  383. iHeight=filesize/iWidth/iDepth;
  384. return dMax;
  385. }*/