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