2 /*-------------------------------------------------------------------------
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.
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.
15 -------------------------------------------------------------------------*/
18 #ifndef CLITKHISIMAGEIO_CXX
19 #define CLITKHISIMAGEIO_CXX
21 #define HEADER_INFO_SIZE 68
24 -------------------------------------------------
25 * @file clitkHisImageIO.cxx
26 * @author Simon Rit <simon.rit@gmail.com>
32 -------------------------------------------------*/
38 #include "clitkHisImageIO.h"
39 #include "clitkCommon.h"
41 //--------------------------------------------------------------------
42 // Read Image Information
43 void clitk::HisImageIO::ReadImageInformation() {
45 std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
47 itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName);
50 char header[HEADER_INFO_SIZE];
\r
51 file.read(header, HEADER_INFO_SIZE);
\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
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
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
76 { case 1: SetNumberOfDimensions(2); break;
77 default: SetNumberOfDimensions(3); break;
80 SetDimensions(0, bry-uly+1);
81 SetDimensions(1, brx-ulx+1);
83 SetDimensions(2, nrframes);
\r
87 //--------------------------------------------------------------------
88 // Read Image Information
89 bool clitk::HisImageIO::CanReadFile(const char* FileNameToRead)
91 std::string filename(FileNameToRead);
92 std::string filenameext = GetExtension(filename);
93 if (filenameext != std::string("his")) return false;
97 //--------------------------------------------------------------------
99 void clitk::HisImageIO::Read(void * buffer) {
102 std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
104 itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName);
107 file.seekg(m_HeaderSize+HEADER_INFO_SIZE, std::ios::beg);
109 itkExceptionMacro(<<"File seek failed (His Read)");
112 file.read((char*)buffer, GetImageSizeInBytes());
\r
114 itkExceptionMacro(<<"Read failed: Wanted "
115 << GetImageSizeInBytes()
116 << " bytes, but read "
117 << file.gcount() << " bytes. The current state is: "
121 //--------------------------------------------------------------------
122 // Write Image Information
123 void clitk::HisImageIO::WriteImageInformation(bool keepOfStream)
125 std::ofstream file(m_FileName.c_str(), std::ios::out | std::ios::binary);
127 itkGenericExceptionMacro(<< "Could not open file (for writing): " << m_FileName);
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
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
144 const unsigned int ndim = GetNumberOfDimensions();
\r
145 if ((ndim < 2) || (ndim > 3))
\r
146 itkExceptionMacro( <<"Only 2D or 3D support");
\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
153 { szHeader[20] = (char)(GetDimensions(0) % 256); // NbFrames lsb
\r
154 szHeader[21] = (char)(GetDimensions(0) / 256); // NbFrames msb
\r
157 switch (GetComponentType())
\r
158 { case itk::ImageIOBase::USHORT:
\r
161 //case AVS_TYPE_INTEGER:
\r
162 // szHeader[32] = 8;
\r
164 //case AVS_TYPE_REAL:
\r
165 // szHeader[32] = 16;
\r
168 itkExceptionMacro(<< "Unsupported field type");
\r
171 file.write(szHeader, m_HeaderSize);
\r
175 //--------------------------------------------------------------------
176 // Write Image Information
177 bool clitk::HisImageIO::CanWriteFile(const char* FileNameToWrite)
179 std::string filename(FileNameToWrite);
180 std::string filenameext = GetExtension(filename);
181 if (filenameext != std::string("his")) return false;
185 //--------------------------------------------------------------------
187 void clitk::HisImageIO::Write(const void * buffer)
189 std::ofstream file(m_FileName.c_str(), std::ios::out | std::ios::binary | std::ios::ate);
191 itkGenericExceptionMacro(<< "Could not open file (for writing): " << m_FileName);
193 file.write((const char *)buffer, GetImageSizeInBytes());
\r
197 #endif /* end #define CLITKHISIMAGEIO_CXX */