1 #ifndef CLITKHISIMAGEIO_CXX
2 #define CLITKHISIMAGEIO_CXX
3 #define HEADER_INFO_SIZE 68
5 -------------------------------------------------
6 * @file clitkHisImageIO.cxx
7 * @author Simon Rit <simon.rit@gmail.com>
13 -------------------------------------------------*/
15 // Based on a true story by the Nederlands Kanker Instituut (AVS_HEIMANN.CPP from the 20090608)
21 #include "clitkHisImageIO.h"
22 #include "clitkCommon.h"
24 //--------------------------------------------------------------------
25 // Read Image Information
26 void clitk::HisImageIO::ReadImageInformation() {
28 std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
30 itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName);
33 char header[HEADER_INFO_SIZE];
\r
34 file.read(header, HEADER_INFO_SIZE);
\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
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
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
59 { case 1: SetNumberOfDimensions(2); break;
60 default: SetNumberOfDimensions(3); break;
63 SetDimensions(0, bry-uly+1);
64 SetDimensions(1, brx-ulx+1);
66 SetDimensions(2, nrframes);
\r
69 //--------------------------------------------------------------------
70 // Read Image Information
71 bool clitk::HisImageIO::CanReadFile(const char* FileNameToRead)
73 std::string filename(FileNameToRead);
74 std::string filenameext = GetExtension(filename);
75 if (filenameext != std::string("his")) return false;
79 //--------------------------------------------------------------------
81 void clitk::HisImageIO::Read(void * buffer) {
83 std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
85 itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName);
88 file.seekg(m_HeaderSize+HEADER_INFO_SIZE, std::ios::beg);
90 itkExceptionMacro(<<"File seek failed (His Read)");
93 file.read((char*)buffer, GetImageSizeInBytes());
\r
95 itkExceptionMacro(<<"Read failed: Wanted "
96 << GetImageSizeInBytes()
97 << " bytes, but read "
98 << file.gcount() << " bytes. The current state is: "
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;
110 //--------------------------------------------------------------------
112 void clitk::HisImageIO::Write(const void* buffer)
114 std::ofstream file(m_FileName.c_str(), std::ios::out | std::ios::binary);
116 itkGenericExceptionMacro(<< "Could not open file (for writing): " << m_FileName);
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
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
133 const unsigned int ndim = GetNumberOfDimensions();
\r
134 if ((ndim < 2) || (ndim > 3))
\r
135 itkExceptionMacro( <<"Only 2D or 3D support");
\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
142 { szHeader[20] = (char)(GetDimensions(0) % 256); // NbFrames lsb
\r
143 szHeader[21] = (char)(GetDimensions(0) / 256); // NbFrames msb
\r
146 switch (GetComponentType())
\r
147 { case itk::ImageIOBase::USHORT:
\r
150 //case AVS_TYPE_INTEGER:
\r
151 // szHeader[32] = 8;
\r
153 //case AVS_TYPE_REAL:
\r
154 // szHeader[32] = 16;
\r
157 itkExceptionMacro(<< "Unsupported field type");
\r
161 file.write(szHeader, m_HeaderSize);
\r
162 file.write((const char *)buffer, GetImageSizeInBytes());
\r
166 #endif /* end #define CLITKHISIMAGEIO_CXX */