]> Creatis software - clitk.git/blob - common/clitkHisImageIO.cxx
Synergy projections file format
[clitk.git] / common / clitkHisImageIO.cxx
1
2 /*-------------------------------------------------------------------------
3                                                                                 
4   Program:   clitk
5   Language:  C++
6                                                                                 
7   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
8   l'Image). All rights reserved. See Doc/License.txt or
9   http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
10                                                                                 
11   This software is distributed WITHOUT ANY WARRANTY; without even
12   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13   PURPOSE.  See the above copyright notices for more information.
14                                                                              
15   -------------------------------------------------------------------------*/
16
17
18 #ifndef CLITKHISIMAGEIO_CXX
19 #define CLITKHISIMAGEIO_CXX
20
21 #define HEADER_INFO_SIZE 68
22
23 /**
24    -------------------------------------------------
25    * @file   clitkHisImageIO.cxx
26    * @author Simon Rit <simon.rit@gmail.com>
27    * @date   16 Feb 2010
28    * 
29    * @brief  
30    * 
31    * 
32    -------------------------------------------------*/
33
34 // std include
35 #include <fstream>
36
37 // clitk include
38 #include "clitkHisImageIO.h"
39 #include "clitkCommon.h"
40
41 //--------------------------------------------------------------------
42 // Read Image Information
43 void clitk::HisImageIO::ReadImageInformation() {
44   // open file
45   std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
46   if ( file.fail() )
47     itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName);
48
49   // read header
50   char header[HEADER_INFO_SIZE];\r
51   file.read(header, HEADER_INFO_SIZE);\r
52 \r
53   if (header[0]!=0 || header[1]!=112 || header[2]!=68 || header[3]!=0)\r
54   { itkExceptionMacro(<< "clitk::HisImageIO::ReadImageInformation: file " << m_FileName << " not in Heimann HIS format version 100");\r
55     return;\r
56   }\r
57
58   int nrframes, type, ulx, uly, brx, bry;\r
59   m_HeaderSize  = header[10] + (header[11]<<8);\r
60   ulx      = header[12] + (header[13]<<8);\r
61   uly      = header[14] + (header[15]<<8);\r
62   brx      = header[16] + (header[17]<<8);\r
63   bry      = header[18] + (header[19]<<8);\r
64   nrframes = header[20] + (header[21]<<8);\r
65   type     = header[32] + (header[34]<<8);\r
66 \r
67   switch(type)\r
68   { case  4: SetComponentType(itk::ImageIOBase::USHORT); break;\r
69 //    case  8: SetComponentType(itk::ImageIOBase::INT);   break;\r
70 //    case 16: SetComponentType(itk::ImageIOBase::FLOAT); break;\r
71 //    case 32: SetComponentType(itk::ImageIOBase::INT);   break;\r
72     default: SetComponentType(itk::ImageIOBase::USHORT); break;\r
73   }\r
74
75   switch(nrframes)
76   { case 1:  SetNumberOfDimensions(2); break;
77     default: SetNumberOfDimensions(3); break;
78   }
79
80   SetDimensions(0, bry-uly+1);
81   SetDimensions(1, brx-ulx+1);
82   if (nrframes>1)\r
83     SetDimensions(2, nrframes);\r
84   file.close();\r
85 } ////
86
87 //--------------------------------------------------------------------
88 // Read Image Information
89 bool clitk::HisImageIO::CanReadFile(const char* FileNameToRead) 
90 {
91   std::string filename(FileNameToRead);
92   std::string filenameext = GetExtension(filename);
93   if (filenameext != std::string("his")) return false;
94   return true;
95 } ////
96
97 //--------------------------------------------------------------------
98 // Read Image Content
99 void clitk::HisImageIO::Read(void * buffer) {
100
101   // open file
102   std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
103   if ( file.fail() )
104     itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName);
105
106
107   file.seekg(m_HeaderSize+HEADER_INFO_SIZE, std::ios::beg);
108   if ( file.fail() )
109     itkExceptionMacro(<<"File seek failed (His Read)");
110
111 \r
112   file.read((char*)buffer, GetImageSizeInBytes());\r
113   if ( file.fail() )
114     itkExceptionMacro(<<"Read failed: Wanted "
115                       << GetImageSizeInBytes()
116                       << " bytes, but read "
117                       << file.gcount() << " bytes. The current state is: "
118                       << file.rdstate());
119 }
120
121 //--------------------------------------------------------------------
122 // Write Image Information
123 void clitk::HisImageIO::WriteImageInformation(bool keepOfStream)
124 {
125   std::ofstream file(m_FileName.c_str(), std::ios::out | std::ios::binary);
126   if ( file.fail() )
127     itkGenericExceptionMacro(<< "Could not open file (for writing): " << m_FileName);
128
129   m_HeaderSize = HEADER_INFO_SIZE + 32;\r
130   char szHeader[HEADER_INFO_SIZE + 32] = {\r
131         0x00, 0x70, 0x44, 0x00, 0x64, 0x00, 0x64, 0x00, 0x20, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00,\r
132         0x00, 0x04, 0x00, 0x04, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x18, 0x41,\r
133         0x04, 0x00, 0x40, 0x5F, 0x48, 0x01, 0x40, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\r
134         0x00, 0x00, 0x00, 0x00, 0x08, 0x63, 0x13, 0x00, 0xE8, 0x51, 0x13, 0x00, 0x5C, 0xE7, 0x12, 0x00,\r
135         0xFE, 0x2A, 0x49, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
136         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
137         0x00, 0x00, 0x00, 0x00};\r
138 \r
139   /* Fill into the header the essentials\r
140      The 'iheader' in previous module is fixed to 0x20, and is included in szHeader.\r
141      The 'ulx' and 'uly' are fixed to 0x01, so that 'brx' and 'bry' reflect the dimensions of\r
142      the image.\r
143   */\r
144   const unsigned int ndim = GetNumberOfDimensions();\r
145   if ((ndim < 2) || (ndim > 3))\r
146     itkExceptionMacro( <<"Only 2D or 3D support");\r
147 \r
148   szHeader[16] = (char)(GetDimensions(0) % 256);        // X-size       lsb\r
149   szHeader[17] = (char)(GetDimensions(0) / 256);        // X-size       msb\r
150   szHeader[18] = (char)(GetDimensions(1) % 256);        // Y-size       lsb\r
151   szHeader[19] = (char)(GetDimensions(1) / 256);        // Y-size       msb\r
152   if (ndim == 3)\r
153   { szHeader[20] = (char)(GetDimensions(0) % 256);      // NbFrames     lsb\r
154     szHeader[21] = (char)(GetDimensions(0) / 256);      // NbFrames     msb\r
155   }\r
156 \r
157   switch (GetComponentType())\r
158   { case itk::ImageIOBase::USHORT:\r
159       szHeader[32] = 4;\r
160       break;\r
161     //case AVS_TYPE_INTEGER:\r
162     //  szHeader[32] = 8;\r
163     //  break;\r
164     //case AVS_TYPE_REAL:\r
165     //  szHeader[32] = 16;\r
166     //  break;\r
167     default:\r
168       itkExceptionMacro(<< "Unsupported field type");\r
169       break;\r
170   }\r
171   file.write(szHeader, m_HeaderSize);\r
172   file.close();\r
173 }
174   
175 //--------------------------------------------------------------------
176 // Write Image Information
177 bool clitk::HisImageIO::CanWriteFile(const char* FileNameToWrite)
178 {
179   std::string filename(FileNameToWrite);
180   std::string filenameext = GetExtension(filename);
181   if (filenameext != std::string("his")) return false;
182   return true;
183 }
184
185 //--------------------------------------------------------------------
186 // Write Image
187 void clitk::HisImageIO::Write(const void * buffer) 
188 {
189   std::ofstream file(m_FileName.c_str(), std::ios::out | std::ios::binary | std::ios::ate);
190   if ( file.fail() )
191     itkGenericExceptionMacro(<< "Could not open file (for writing): " << m_FileName);
192
193   file.write((const char *)buffer, GetImageSizeInBytes());\r
194   file.close();
195 } ////
196
197 #endif /* end #define CLITKHISIMAGEIO_CXX */
198