1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
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
22 -------------------------------------------------
23 * @file clitkHisImageIO.cxx
24 * @author Simon Rit <simon.rit@gmail.com>
30 -------------------------------------------------*/
32 // Based on a true story by the Nederlands Kanker Instituut (AVS_HEIMANN.CPP from the 20090608)
38 #include "clitkHisImageIO.h"
39 #include "clitkCommon.h"
41 //--------------------------------------------------------------------
42 // Read Image Information
43 void clitk::HisImageIO::ReadImageInformation()
46 std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
48 itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName);
51 char header[HEADER_INFO_SIZE];
52 file.read(header, HEADER_INFO_SIZE);
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");
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);
70 SetComponentType(itk::ImageIOBase::USHORT);
72 // case 8: SetComponentType(itk::ImageIOBase::INT); break;
73 // case 16: SetComponentType(itk::ImageIOBase::FLOAT); break;
74 // case 32: SetComponentType(itk::ImageIOBase::INT); break;
76 SetComponentType(itk::ImageIOBase::USHORT);
82 SetNumberOfDimensions(2);
85 SetNumberOfDimensions(3);
89 SetDimensions(0, bry-uly+1);
90 SetDimensions(1, brx-ulx+1);
92 SetDimensions(2, nrframes);
95 //--------------------------------------------------------------------
96 // Read Image Information
97 bool clitk::HisImageIO::CanReadFile(const char* FileNameToRead)
99 std::string filename(FileNameToRead);
100 std::string filenameext = GetExtension(filename);
101 if (filenameext != std::string("his")) return false;
105 //--------------------------------------------------------------------
106 // Read Image Content
107 void clitk::HisImageIO::Read(void * buffer)
110 std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
112 itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName);
115 file.seekg(m_HeaderSize+HEADER_INFO_SIZE, std::ios::beg);
117 itkExceptionMacro(<<"File seek failed (His Read)");
120 file.read((char*)buffer, GetImageSizeInBytes());
122 itkExceptionMacro(<<"Read failed: Wanted "
123 << GetImageSizeInBytes()
124 << " bytes, but read "
125 << file.gcount() << " bytes. The current state is: "
129 //--------------------------------------------------------------------
130 bool clitk::HisImageIO::CanWriteFile(const char* FileNameToWrite)
132 std::string filename(FileNameToWrite);
133 std::string filenameext = GetExtension(filename);
134 if (filenameext != std::string("his")) return false;
138 //--------------------------------------------------------------------
140 void clitk::HisImageIO::Write(const void* buffer)
142 std::ofstream file(m_FileName.c_str(), std::ios::out | std::ios::binary);
144 itkGenericExceptionMacro(<< "Could not open file (for writing): " << m_FileName);
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
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
162 const unsigned int ndim = GetNumberOfDimensions();
163 if ((ndim < 2) || (ndim > 3))
164 itkExceptionMacro( <<"Only 2D or 3D support");
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
171 szHeader[20] = (char)(GetDimensions(0) % 256); // NbFrames lsb
172 szHeader[21] = (char)(GetDimensions(0) / 256); // NbFrames msb
175 switch (GetComponentType()) {
176 case itk::ImageIOBase::USHORT:
179 //case AVS_TYPE_INTEGER:
182 //case AVS_TYPE_REAL:
183 // szHeader[32] = 16;
186 itkExceptionMacro(<< "Unsupported field type");
190 file.write(szHeader, m_HeaderSize);
191 file.write((const char *)buffer, GetImageSizeInBytes());
195 #endif /* end #define CLITKHISIMAGEIO_CXX */