TIFFDoc.cpp
上传用户:lbr_007
上传日期:2019-05-31
资源大小:282k
文件大小:7k
源码类别:

传真(Fax)编程

开发平台:

Visual C++

  1. // TIFFDoc.cpp : implementation of the TIFFDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "TIFFSample.h"
  5. #include "TIFFDoc.h"
  6. #include "dibtiff.h"
  7. #include "dibbmp.h"
  8. #include "dibijg.h"
  9. using namespace std;
  10. char * GetInitialFolder(void);
  11. /////////////////////////////////////////////////////////////////////////////
  12. // TIFFDoc
  13. IMPLEMENT_DYNCREATE(TIFFDoc, CDocument)
  14. BEGIN_MESSAGE_MAP(TIFFDoc, CDocument)
  15. //{{AFX_MSG_MAP(TIFFDoc)
  16. ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  17. ON_COMMAND(ID_FILE_SAVE, OnFileSave)
  18. ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
  19. ON_UPDATE_COMMAND_UI(ID_FILE_PROPERTIES, OnUpdateFileProperties)
  20. ON_COMMAND(ID_FILE_PROPERTIES, OnFileProperties)
  21. //}}AFX_MSG_MAP
  22. END_MESSAGE_MAP()
  23. /////////////////////////////////////////////////////////////////////////////
  24. // TIFFDoc construction/destruction
  25. TIFFDoc::TIFFDoc()
  26. {
  27. m_fileType = UnknownFileType;
  28. m_currentDIB = 0;
  29. }
  30. TIFFDoc::~TIFFDoc()
  31. {
  32. ClearImages();
  33. }
  34. BOOL TIFFDoc::OnNewDocument()
  35. {
  36. if (!CDocument::OnNewDocument())
  37. return FALSE;
  38. // TODO: add reinitialization code here
  39. // (SDI documents will reuse this document)
  40. return TRUE;
  41. }
  42. /////////////////////////////////////////////////////////////////////////////
  43. // TIFFDoc serialization
  44. void TIFFDoc::Serialize(CArchive& ar)
  45. {
  46. if (ar.IsStoring())
  47. {
  48. // TODO: add storing code here
  49. }
  50. else
  51. {
  52. // TODO: add loading code here
  53. }
  54. }
  55. /////////////////////////////////////////////////////////////////////////////
  56. // TIFFDoc diagnostics
  57. #ifdef _DEBUG
  58. void TIFFDoc::AssertValid() const
  59. {
  60. CDocument::AssertValid();
  61. }
  62. void TIFFDoc::Dump(CDumpContext& dc) const
  63. {
  64. CDocument::Dump(dc);
  65. }
  66. #endif //_DEBUG
  67. /////////////////////////////////////////////////////////////////////////////
  68. // TIFFDoc commands
  69. void TIFFDoc::OnFileOpen() 
  70. {
  71. CString file_types = "BMP, JPEG, and TIFF Files|*.bmp;*.jpg;*.jpeg;*.tif;*.tiff|";
  72. file_types += "BMP Files (*.bmp)|*.bmp|";
  73. file_types += "JPEG Files (*.jpg)|*.jpg;*.jpeg|";
  74. file_types += "TIFF Files (*.tif)|*.tif;*.tiff|";
  75. file_types += "|";
  76. CFileDialog dlg(TRUE,NULL,NULL,
  77. OFN_HIDEREADONLY | OFN_EXPLORER,
  78. (LPCTSTR)file_types,NULL);
  79. if (dlg.DoModal() == IDOK)
  80. {
  81. CString filename = dlg.GetPathName();
  82. m_fileType = DetermineFileType(filename);
  83. ClearImages();
  84. switch (m_fileType){
  85. case BMPFileType:
  86. {
  87. DIBSection * dib = new DIBSection;
  88. OpenBMP2DIB((LPCTSTR)filename, *dib);
  89. if (dib->IsCreated())
  90. {
  91. m_dibs.AddElement(dib);
  92. }
  93. else
  94. {
  95. delete dib;
  96. }
  97. }
  98. break;
  99. case JPEGFileType:
  100. {
  101. DIBSection * dib = new DIBSection;
  102. OpenIJG2DIB((LPCTSTR)filename, *dib);
  103. if (dib->IsCreated())
  104. {
  105. m_dibs.AddElement(dib);
  106. }
  107. else
  108. {
  109. delete dib;
  110. }
  111. }
  112. break;
  113. case TIFFFileType:
  114. {
  115. ArrayContainer<TIFFSubImage> imgs;
  116. ReadTIFFDirectories((LPCTSTR)filename, imgs);
  117. if (imgs.GetSize() > 0)
  118. {
  119. for (UINT32 i = 0; i < imgs.GetSize(); i++){
  120. DIBSection * dib = new DIBSection;
  121. OpenTIFF2DIB((LPCTSTR)filename, *dib, i);
  122. if (dib->IsCreated())
  123. {
  124. m_dibs.AddElement(dib);
  125. }
  126. else
  127. {
  128. delete dib;
  129. }
  130. }
  131. }
  132. }
  133. break;
  134. default:
  135. {
  136. AfxMessageBox("No support for this type of file",MB_ICONERROR);
  137. }
  138. break;
  139. }
  140. if (m_dibs.GetSize() > 0)
  141. {
  142. m_filename = (LPCTSTR)filename;
  143. SetTitle(m_filename.c_str());
  144. }
  145. UpdateAllViews(NULL);
  146. }
  147. }
  148. void TIFFDoc::ClearImages(void)
  149. {
  150. UINT32 size = m_dibs.GetSize();
  151. for (UINT32 i = 0; i < size; i++){
  152. delete m_dibs.GetData()[i];
  153. }
  154. m_dibs.ClearArray();
  155. }
  156. TIFFDoc::ImageFileTypes TIFFDoc::DetermineFileType(CString& filename)
  157. {
  158. ImageFileTypes result = UnknownFileType;
  159. CString tmpFile = filename;
  160. tmpFile.MakeUpper();
  161. int length = tmpFile.GetLength();
  162. if (length > 4)
  163. {
  164. char * cptr = (char *)(LPCTSTR)tmpFile;
  165. int last4 = length - 4;
  166. if (last4 < 0) last4 = 0;
  167. int last5 = length - 5;
  168. if (last5 < 0) last5 = 0;
  169. if (strcmp(&cptr[last4], ".BMP") == 0)
  170. {
  171. result = BMPFileType;
  172. }
  173. else if ((strcmp(&cptr[last4],".JPG") == 0) ||
  174.  (strcmp(&cptr[last5],".JPEG") == 0))
  175. {
  176. result = JPEGFileType;
  177. }
  178. else if ((strcmp(&cptr[last4],".TIF") == 0) ||
  179.  (strcmp(&cptr[last5],".TIFF") == 0))
  180. {
  181. result = TIFFFileType;
  182. }
  183. else if (strcmp(&cptr[last4],".GIF") == 0)
  184. {
  185. result = GIFFileType;
  186. }
  187. else if (cptr[last4] == '.')
  188. {
  189. result = OtherFileType;
  190. }
  191. }
  192. return result;
  193. }
  194. void TIFFDoc::OnFileSave() 
  195. {
  196. CString file_types;
  197. file_types += "BMP File (*.bmp)|*.bmp|";
  198. file_types += "JPEG File (*.jpg)|*.jpg;*.jpeg|";
  199. file_types += "TIFF File (*.tif)|*.tif;*.tiff|";
  200. file_types += "|";
  201. CFileDialog dlg(FALSE,NULL,NULL,
  202. OFN_HIDEREADONLY | OFN_EXPLORER,
  203. (LPCTSTR)file_types,NULL);
  204. if (dlg.DoModal() == IDOK)
  205. {
  206. CString filename = dlg.GetPathName();
  207. UINT32 ext = dlg.GetTypeInfoCount();
  208. if (DetermineFileType(filename) == UnknownFileType)
  209. {
  210. switch ((dlg.m_ofn.nFilterIndex-1)){
  211. case 0: filename += ".bmp"; break;
  212. case 1: filename += ".jpg"; break;
  213. case 2: filename += ".tif"; break;
  214. }
  215. }
  216. int result = 0;
  217. CString errMsg;
  218. ImageFileTypes fileType = DetermineFileType(filename);
  219. DIBSection * dib = GetDIB(m_currentDIB);
  220. if (dib)
  221. {
  222. DIBSection saveDIB(*dib);
  223. switch (fileType){
  224. case BMPFileType:
  225. {
  226. result = SaveDIB2BMP((const char *)(LPCTSTR)filename,saveDIB);
  227. }
  228. break;
  229. case JPEGFileType:
  230. {
  231. result = SaveDIB2IJG((const char *)(LPCTSTR)filename,saveDIB);
  232. }
  233. break;
  234. case TIFFFileType:
  235. {
  236. result = SaveDIB2TIFF((const char *)(LPCTSTR)filename,saveDIB);
  237. }
  238. break;
  239. case GIFFileType:
  240. {
  241. errMsg = "GIF files not supported";
  242. }
  243. break;
  244. case OtherFileType:
  245. {
  246. errMsg = "File type not supported";
  247. }
  248. break;
  249. case UnknownFileType:
  250. {
  251. errMsg = "Unknown file type";
  252. }
  253. break;
  254. }
  255. }
  256. }
  257. }
  258. void TIFFDoc::OnFileSaveAs() 
  259. {
  260. OnFileSave();
  261. }
  262. void TIFFDoc::GetFilenameParts(const string& fullFilePath,
  263. string& pathOnly, string& fileNameOnly, string& extOnly)
  264. {
  265. if (fullFilePath.length() > 0)
  266. {
  267. char c;
  268. INT32 i;
  269. INT32 ndx = fullFilePath.length() - 1;
  270. while (ndx > 0){
  271. c = fullFilePath.c_str()[ndx];
  272. if (c == (char)92)
  273. {
  274. for (i = (ndx+1); i < fullFilePath.length(); i++){
  275. c = fullFilePath.c_str()[i];
  276. if (c != '.')
  277. {
  278. fileNameOnly += c;
  279. }
  280. else
  281. {
  282. break;
  283. }
  284. }
  285. for (i = 0; i < ndx; i++){
  286. c = fullFilePath.c_str()[i];
  287. pathOnly += c;
  288. }
  289. break;
  290. }
  291. else if (c == '.')
  292. {
  293. extOnly = &fullFilePath.c_str()[ndx+1];
  294. }
  295. ndx--;
  296. }
  297. }
  298. }
  299. void TIFFDoc::OnUpdateFileProperties(CCmdUI* pCmdUI) 
  300. {
  301. pCmdUI->Enable(m_fileType == TIFFFileType);
  302. }
  303. void TIFFDoc::OnFileProperties() 
  304. {
  305. ArrayContainer<string> properties;
  306. GetTIFFProperties(m_filename.c_str(), m_currentDIB, properties);
  307. string msg = m_filename;
  308. msg += " has the following properties:n";
  309. for (int i = 0; i < properties.GetSize(); i++){
  310. msg += properties.GetData()[i];
  311. msg += "n";
  312. }
  313. AfxMessageBox(msg.c_str(), MB_ICONINFORMATION);
  314. }