]> Creatis software - clitk.git/blob - common/clitkHisImageIO.cxx
d95a1b4e9271543e715bafda2ece5505db81078b
[clitk.git] / common / clitkHisImageIO.cxx
1 #ifndef CLITKHISIMAGEIO_CXX
2 #define CLITKHISIMAGEIO_CXX
3 #define HEADER_INFO_SIZE 68
4 /**
5    -------------------------------------------------
6    * @file   clitkHisImageIO.cxx
7    * @author Simon Rit <simon.rit@gmail.com>
8    * @date   16 Feb 2010
9    * 
10    * @brief  
11    * 
12    * 
13    -------------------------------------------------*/
14
15 // Based on a true story by the Nederlands Kanker Instituut (AVS_HEIMANN.CPP from the 20090608)
16
17 // std include
18 #include <fstream>
19
20 // clitk include
21 #include "clitkHisImageIO.h"
22 #include "clitkCommon.h"
23
24 //--------------------------------------------------------------------
25 // Read Image Information
26 void clitk::HisImageIO::ReadImageInformation() {
27   // open file
28   std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
29   if ( file.fail() )
30     itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName);
31
32   // read header
33   char header[HEADER_INFO_SIZE];\r
34   file.read(header, HEADER_INFO_SIZE);\r
35 \r
36   if (header[0]!=0 || header[1]!=112 || header[2]!=68 || header[3]!=0)\r
37   { itkExceptionMacro(<< "clitk::HisImageIO::ReadImageInformation: file " << m_FileName << " not in Heimann HIS format version 100");\r
38     return;\r
39   }\r
40
41   int nrframes, type, ulx, uly, brx, bry;\r
42   m_HeaderSize  = header[10] + (header[11]<<8);\r
43   ulx      = header[12] + (header[13]<<8);\r
44   uly      = header[14] + (header[15]<<8);\r
45   brx      = header[16] + (header[17]<<8);\r
46   bry      = header[18] + (header[19]<<8);\r
47   nrframes = header[20] + (header[21]<<8);\r
48   type     = header[32] + (header[34]<<8);\r
49 \r
50   switch(type)\r
51   { case  4: SetComponentType(itk::ImageIOBase::USHORT); break;\r
52 //    case  8: SetComponentType(itk::ImageIOBase::INT);   break;\r
53 //    case 16: SetComponentType(itk::ImageIOBase::FLOAT); break;\r
54 //    case 32: SetComponentType(itk::ImageIOBase::INT);   break;\r
55     default: SetComponentType(itk::ImageIOBase::USHORT); break;\r
56   }\r
57
58   switch(nrframes)
59   { case 1:  SetNumberOfDimensions(2); break;
60     default: SetNumberOfDimensions(3); break;
61   }
62
63   SetDimensions(0, bry-uly+1);
64   SetDimensions(1, brx-ulx+1);
65   if (nrframes>1)\r
66     SetDimensions(2, nrframes);\r
67 } ////
68
69 //--------------------------------------------------------------------
70 // Read Image Information
71 bool clitk::HisImageIO::CanReadFile(const char* FileNameToRead) 
72 {
73   std::string filename(FileNameToRead);
74   std::string filenameext = GetExtension(filename);
75   if (filenameext != std::string("his")) return false;
76   return true;
77 } ////
78
79 //--------------------------------------------------------------------
80 // Read Image Content
81 void clitk::HisImageIO::Read(void * buffer) {
82   // open file
83   std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
84   if ( file.fail() )
85     itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName);
86
87
88   file.seekg(m_HeaderSize+HEADER_INFO_SIZE, std::ios::beg);
89   if ( file.fail() )
90     itkExceptionMacro(<<"File seek failed (His Read)");
91
92 \r
93   file.read((char*)buffer, GetImageSizeInBytes());\r
94   if ( file.fail() )
95     itkExceptionMacro(<<"Read failed: Wanted "
96                       << GetImageSizeInBytes()
97                       << " bytes, but read "
98                       << file.gcount() << " bytes. The current state is: "
99                       << file.rdstate());
100 }
101   
102 //--------------------------------------------------------------------
103 bool clitk::HisImageIO::CanWriteFile(const char* FileNameToWrite)
104 { std::string filename(FileNameToWrite);
105   std::string filenameext = GetExtension(filename);
106   if (filenameext != std::string("his")) return false;
107   return true;
108 }
109
110 //--------------------------------------------------------------------
111 // Write Image
112 void clitk::HisImageIO::Write(const void* buffer)
113 {
114   std::ofstream file(m_FileName.c_str(), std::ios::out | std::ios::binary);
115   if ( file.fail() )
116     itkGenericExceptionMacro(<< "Could not open file (for writing): " << m_FileName);
117
118   m_HeaderSize = HEADER_INFO_SIZE + 32;\r
119   char szHeader[HEADER_INFO_SIZE + 32] = {\r
120         0x00, 0x70, 0x44, 0x00, 0x64, 0x00, 0x64, 0x00, 0x20, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00,\r
121         0x00, 0x04, 0x00, 0x04, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x18, 0x41,\r
122         0x04, 0x00, 0x40, 0x5F, 0x48, 0x01, 0x40, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\r
123         0x00, 0x00, 0x00, 0x00, 0x08, 0x63, 0x13, 0x00, 0xE8, 0x51, 0x13, 0x00, 0x5C, 0xE7, 0x12, 0x00,\r
124         0xFE, 0x2A, 0x49, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
125         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
126         0x00, 0x00, 0x00, 0x00};\r
127 \r
128   /* Fill into the header the essentials\r
129      The 'iheader' in previous module is fixed to 0x20, and is included in szHeader.\r
130      The 'ulx' and 'uly' are fixed to 0x01, so that 'brx' and 'bry' reflect the dimensions of\r
131      the image.\r
132   */\r
133   const unsigned int ndim = GetNumberOfDimensions();\r
134   if ((ndim < 2) || (ndim > 3))\r
135     itkExceptionMacro( <<"Only 2D or 3D support");\r
136 \r
137   szHeader[16] = (char)(GetDimensions(0) % 256);        // X-size       lsb\r
138   szHeader[17] = (char)(GetDimensions(0) / 256);        // X-size       msb\r
139   szHeader[18] = (char)(GetDimensions(1) % 256);        // Y-size       lsb\r
140   szHeader[19] = (char)(GetDimensions(1) / 256);        // Y-size       msb\r
141   if (ndim == 3)\r
142   { szHeader[20] = (char)(GetDimensions(0) % 256);      // NbFrames     lsb\r
143     szHeader[21] = (char)(GetDimensions(0) / 256);      // NbFrames     msb\r
144   }\r
145 \r
146   switch (GetComponentType())\r
147   { case itk::ImageIOBase::USHORT:\r
148       szHeader[32] = 4;\r
149       break;\r
150     //case AVS_TYPE_INTEGER:\r
151     //  szHeader[32] = 8;\r
152     //  break;\r
153     //case AVS_TYPE_REAL:\r
154     //  szHeader[32] = 16;\r
155     //  break;\r
156     default:\r
157       itkExceptionMacro(<< "Unsupported field type");\r
158       break;\r
159   }\r
160 \r
161   file.write(szHeader, m_HeaderSize);\r
162   file.write((const char *)buffer, GetImageSizeInBytes());\r
163   file.close();
164 } ////
165
166 #endif /* end #define CLITKHISIMAGEIO_CXX */
167