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

图片显示

开发平台:

Visual C++

  1. // Raw.cpp: implementation of the CRaw class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "QuickImage.h"
  6. #include "Raw.h"
  7. #include "dlgguesswidth.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. CRaw::CRaw() : CImage()
  17. {
  18. }
  19. CRaw::~CRaw()
  20. {
  21. }
  22. BOOL CRaw::ReadFromFile(const LPCTSTR lpszPathName)
  23. {
  24. ASSERT(NULL != lpszPathName);
  25. CDlgGuessWidth dlg;
  26. strcpy(dlg.PATHNAME, lpszPathName);
  27. strcpy(dlg.TITLE, "Open Raw File:");
  28. dlg.m_iDepth=0;
  29. if(dlg.DoModal() != IDOK)
  30. {
  31. return FALSE;
  32. }
  33. m_iWidth=dlg.m_iWidth;
  34. m_iHeight=dlg.m_iHeight;
  35. strcpy(m_szPathName,lpszPathName);
  36. return TRUE;
  37. }
  38. HDIB CRaw::Show()
  39. {
  40. CFile file;
  41. if(!file.Open(m_szPathName,CFile::modeRead | CFile::shareExclusive))
  42. {
  43. return NULL;
  44. }
  45. DWORD size=m_iWidth*m_iHeight;
  46. HANDLE hByte=NULL;
  47. BYTE* pByte=NULL;
  48. if((hByte=GlobalAlloc(GHND, size)) == NULL)
  49. {
  50. file.Close();
  51. return NULL;
  52. }
  53. if((pByte=(BYTE*)GlobalLock(hByte)) == NULL)
  54. {
  55. file.Close();
  56. return NULL;
  57. }
  58. if(file.Read(pByte, size) != size)
  59. {
  60. file.Close();
  61. GlobalUnlock(hByte);
  62. GlobalFree(hByte);
  63. return NULL;
  64. }
  65. file.Close();
  66. HDIB hDIB = NULL;
  67. BYTE *pTemp = new BYTE[m_iWidth];
  68. if(NULL != pTemp)
  69. {
  70. BYTE *top = pByte;
  71. BYTE *bottom = pByte + m_iWidth * (m_iHeight - 1);
  72. while(top < bottom)
  73. {
  74. memcpy(pTemp, top, m_iWidth);
  75. memcpy(top, bottom, m_iWidth);
  76. memcpy(bottom, pTemp, m_iWidth);
  77. top += m_iWidth;
  78. bottom -= m_iWidth;
  79. }
  80. delete pTemp;
  81. hDIB = ::GenBmp(m_iWidth, m_iHeight, 8, pByte);
  82. }
  83. try
  84. {
  85. GlobalUnlock(hByte);
  86. GlobalFree(hByte);
  87. }
  88. catch(CMemoryException *e)
  89. {
  90. e->ReportError();
  91. e->Delete();
  92. if(hDIB)
  93. {
  94. ::DeleteObject(hDIB);
  95. }
  96. return NULL;
  97. }
  98. return hDIB;
  99. }
  100. BOOL CRaw::SaveRaw(const LPCTSTR lpszPathName, const HDIB hDIB)
  101. {
  102. ASSERT(strlen(lpszPathName) > 0);
  103. ASSERT(NULL != hDIB);
  104. CFile file;
  105. CFileException fe;
  106. if (!file.Open(lpszPathName, CFile::modeCreate |
  107. CFile::modeReadWrite | CFile::shareExclusive, &fe))
  108. {
  109. return FALSE;
  110. }
  111. TRY
  112. {
  113. LPSTR lpDIB = (LPSTR)GlobalLock(hDIB);
  114. LPSTR lpBITs = ::FindDIBBits(lpDIB);
  115. int iWidth = ::DIBWidth(lpDIB);
  116. int iHeight = abs(::DIBHeight(lpDIB));
  117. BYTE *pTemp = new BYTE[iWidth];
  118. if(NULL != pTemp)
  119. {
  120. BYTE *top = (BYTE*)lpBITs;
  121. BYTE *bottom = (BYTE*)lpBITs + iWidth * (iHeight - 1);
  122. while(top < bottom)
  123. {
  124. memcpy(pTemp, top, iWidth);
  125. memcpy(top, bottom, iWidth);
  126. memcpy(bottom, pTemp, iWidth);
  127. top += iWidth;
  128. bottom -= iWidth;
  129. }
  130. file.Write(lpBITs,
  131. ::DIBWidth(lpDIB) * iHeight * int(((PBITMAPINFOHEADER)lpDIB)->biBitCount / 8.0));
  132. top = (BYTE*)lpBITs;
  133. bottom = (BYTE*)lpBITs + iWidth * (iHeight - 1);
  134. while(top < bottom)
  135. {
  136. memcpy(pTemp, top, iWidth);
  137. memcpy(top, bottom, iWidth);
  138. memcpy(bottom, pTemp, iWidth);
  139. top += iWidth;
  140. bottom -= iWidth;
  141. }
  142. delete pTemp;
  143. }
  144. GlobalUnlock(hDIB);
  145. file.Close();
  146. }
  147. CATCH (CException, eSave)
  148. {
  149. file.Abort(); // will not throw an exception
  150. return FALSE;
  151. }
  152. END_CATCH
  153. // replace calls to Serialize with SaveDIB function
  154. return FALSE;
  155. }