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
86 //--------------------------------------------------------------------
87 // Read Image Information
88 bool clitk::HisImageIO::CanReadFile(const char* FileNameToRead)
90 std::string filename(FileNameToRead);
91 std::string filenameext = GetExtension(filename);
92 if (filenameext != std::string("his")) return false;
96 //--------------------------------------------------------------------
98 void clitk::HisImageIO::Read(void * buffer) {
100 std::ifstream file(m_FileName.c_str(), std::ios::in | std::ios::binary);
102 itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName);
105 file.seekg(m_HeaderSize+HEADER_INFO_SIZE, std::ios::beg);
107 itkExceptionMacro(<<"File seek failed (His Read)");
110 file.read((char*)buffer, GetImageSizeInBytes());
\r
112 itkExceptionMacro(<<"Read failed: Wanted "
113 << GetImageSizeInBytes()
114 << " bytes, but read "
115 << file.gcount() << " bytes. The current state is: "
119 //--------------------------------------------------------------------
120 bool clitk::HisImageIO::CanWriteFile(const char* FileNameToWrite)
121 { std::string filename(FileNameToWrite);
122 std::string filenameext = GetExtension(filename);
123 if (filenameext != std::string("his")) return false;
127 //--------------------------------------------------------------------
129 void clitk::HisImageIO::Write(const void* buffer)
131 std::ofstream file(m_FileName.c_str(), std::ios::out | std::ios::binary);
133 itkGenericExceptionMacro(<< "Could not open file (for writing): " << m_FileName);
135 m_HeaderSize = HEADER_INFO_SIZE + 32;
\r
136 char szHeader[HEADER_INFO_SIZE + 32] = {
\r
137 0x00, 0x70, 0x44, 0x00, 0x64, 0x00, 0x64, 0x00, 0x20, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00,
\r
138 0x00, 0x04, 0x00, 0x04, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x18, 0x41,
\r
139 0x04, 0x00, 0x40, 0x5F, 0x48, 0x01, 0x40, 0x00, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
\r
140 0x00, 0x00, 0x00, 0x00, 0x08, 0x63, 0x13, 0x00, 0xE8, 0x51, 0x13, 0x00, 0x5C, 0xE7, 0x12, 0x00,
\r
141 0xFE, 0x2A, 0x49, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
\r
142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
\r
143 0x00, 0x00, 0x00, 0x00};
\r
145 /* Fill into the header the essentials
\r
146 The 'iheader' in previous module is fixed to 0x20, and is included in szHeader.
\r
147 The 'ulx' and 'uly' are fixed to 0x01, so that 'brx' and 'bry' reflect the dimensions of
\r
150 const unsigned int ndim = GetNumberOfDimensions();
\r
151 if ((ndim < 2) || (ndim > 3))
\r
152 itkExceptionMacro( <<"Only 2D or 3D support");
\r
154 szHeader[16] = (char)(GetDimensions(0) % 256); // X-size lsb
\r
155 szHeader[17] = (char)(GetDimensions(0) / 256); // X-size msb
\r
156 szHeader[18] = (char)(GetDimensions(1) % 256); // Y-size lsb
\r
157 szHeader[19] = (char)(GetDimensions(1) / 256); // Y-size msb
\r
159 { szHeader[20] = (char)(GetDimensions(0) % 256); // NbFrames lsb
\r
160 szHeader[21] = (char)(GetDimensions(0) / 256); // NbFrames msb
\r
163 switch (GetComponentType())
\r
164 { case itk::ImageIOBase::USHORT:
\r
167 //case AVS_TYPE_INTEGER:
\r
168 // szHeader[32] = 8;
\r
170 //case AVS_TYPE_REAL:
\r
171 // szHeader[32] = 16;
\r
174 itkExceptionMacro(<< "Unsupported field type");
\r
178 file.write(szHeader, m_HeaderSize);
\r
179 file.write((const char *)buffer, GetImageSizeInBytes());
\r
183 #endif /* end #define CLITKHISIMAGEIO_CXX */