1 #ifndef CLITKVOXIMAGEIO_CXX
2 #define CLITKVOXIMAGEIO_CXX
4 -------------------------------------------------
5 * @file clitkVoxImageIO.cxx
6 * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
7 * @date 17 May 2006 08:03:07
12 -------------------------------------------------*/
15 #include "clitkVoxImageIO.h"
16 #include "clitkCommon.h"
18 // itk include (for itkReadRawBytesAfterSwappingMacro)
19 #include "itkRawImageIO.h"
21 //--------------------------------------------------------------------
22 // Read Image Information
23 void clitk::VoxImageIO::ReadImageInformation() {
26 clitk::openFileForReading(is, m_FileName);
32 itkExceptionMacro(<<"read magic number '" << mn << "' while expect VOX");
34 // read vox file version
39 itkExceptionMacro(<<"read old format '" << mn << "'. TODO");
42 // ONLY 3D IMAGES YET ...
44 // read grid size/spacing
45 itk::Vector<unsigned int,3> dim;
46 itk::Vector<double,3> spacing;
47 itk::Vector<double,3> origin;
62 if (d != 3 && d != 2) {
63 itkExceptionMacro(<<"could not read no " << d << "D image (only 2D and 3D). TODO");
67 std::string dataTypeName;
72 m_HeaderSize = is.tellg();
76 // set dimension values
77 SetNumberOfDimensions(d);
78 for(int i=0; i<d; i++) {
79 SetDimensions(i,dim[i]);
80 SetSpacing(i,spacing[i]);
81 SetOrigin(i,origin[i]);
84 // set other information
85 SetByteOrderToLittleEndian();
86 SetPixelType(itk::ImageIOBase::SCALAR);
87 SetNumberOfComponents(1);
89 if (dataTypeName == "char") SetComponentType(itk::ImageIOBase::CHAR);
90 else if (dataTypeName == "schar") SetComponentType(itk::ImageIOBase::CHAR);
91 else if (dataTypeName == "uchar" || dataTypeName == "unsigned_char") SetComponentType(itk::ImageIOBase::UCHAR);
92 else if (dataTypeName == "sshort") SetComponentType(itk::ImageIOBase::SHORT);
93 else if (dataTypeName == "ushort") SetComponentType(itk::ImageIOBase::USHORT);
94 else if (dataTypeName == "int") SetComponentType(itk::ImageIOBase::INT);
95 else if (dataTypeName == "sint") SetComponentType(itk::ImageIOBase::INT);
96 else if (dataTypeName == "uint") SetComponentType(itk::ImageIOBase::UINT);
97 else if (dataTypeName == "float") SetComponentType(itk::ImageIOBase::FLOAT);
98 else if (dataTypeName == "double") SetComponentType(itk::ImageIOBase::DOUBLE);
100 itkExceptionMacro(<<"Read failed: Wanted pixel type "
101 << "(char, uchar, short, ushort, int, uint, float, double)"
102 << " but read " << dataTypeName);
107 //--------------------------------------------------------------------
108 // Read Image Information
109 bool clitk::VoxImageIO::CanReadFile(const char* FileNameToRead)
111 std::string filename(FileNameToRead);
112 std::string filenameext = GetExtension(filename);
113 if (filenameext != std::string("vox")) return false;
117 //--------------------------------------------------------------------
118 // Read Image Content
119 void clitk::VoxImageIO::Read(void * buffer)
121 // Adapted from itkRawImageIO
124 openFileForReading(file, m_FileName);
127 unsigned long streamStart = m_HeaderSize;
128 file.seekg((long)streamStart, std::ios::beg);
130 itkExceptionMacro(<<"File seek failed (Vox Read)");
133 unsigned long numberOfBytesToBeRead = GetComponentSize();
134 for(unsigned int i=0; i<GetNumberOfDimensions(); i++) numberOfBytesToBeRead *= GetDimensions(i);
136 //DD(numberOfBytesToBeRead);
138 if(!this->ReadBufferAsBinary(file, buffer, numberOfBytesToBeRead)) {
139 itkExceptionMacro(<<"Read failed: Wanted "
140 << numberOfBytesToBeRead
141 << " bytes, but read "
142 << file.gcount() << " bytes.");
144 itkDebugMacro(<< "Reading Done");
148 // Swap bytes if necessary
149 if itkReadRawBytesAfterSwappingMacro( unsigned short, USHORT )
150 else if itkReadRawBytesAfterSwappingMacro( short, SHORT )
151 else if itkReadRawBytesAfterSwappingMacro( char, CHAR )
152 else if itkReadRawBytesAfterSwappingMacro( unsigned char, UCHAR )
153 else if itkReadRawBytesAfterSwappingMacro( unsigned int, UINT )
154 else if itkReadRawBytesAfterSwappingMacro( int, INT )
155 else if itkReadRawBytesAfterSwappingMacro( float, FLOAT )
156 else if itkReadRawBytesAfterSwappingMacro( double, DOUBLE );
160 //--------------------------------------------------------------------
161 // Write Image Information
162 void clitk::VoxImageIO::WriteImageInformation(bool keepOfStream)
165 if (GetNumberOfDimensions() != 3 && GetNumberOfDimensions() != 2) {
166 itkExceptionMacro(<<"Write failed: only 3D and 2D image for Vox file format yet.");
170 clitk::openFileForWriting(file, m_FileName);
171 // write magic number
172 file << "VOX v2" << std::endl;
173 // write grid size/spacing
174 file << "# Size" << std::endl;
175 file << GetDimensions(0) << " "
176 << GetDimensions(1) << " "
177 << GetDimensions(2) << std::endl;
178 file << "# Spacing" << std::endl;
180 file << GetSpacing(0) << " "
181 << GetSpacing(1) << " "
182 << GetSpacing(2) << std::endl;
183 file << "# Image dim" << std::endl << "3" << std::endl;
184 file << "# Image type" << std::endl;
186 std::string dataTypeName;
187 if (GetComponentType() == itk::ImageIOBase::CHAR) dataTypeName = "schar";
188 else if (GetComponentType() == itk::ImageIOBase::UCHAR) dataTypeName = "uchar";
189 else if (GetComponentType() == itk::ImageIOBase::SHORT) dataTypeName = "sshort";
190 else if (GetComponentType() == itk::ImageIOBase::USHORT) dataTypeName = "ushort";
191 else if (GetComponentType() == itk::ImageIOBase::INT) dataTypeName = "int";
192 else if (GetComponentType() == itk::ImageIOBase::UINT) dataTypeName = "uint";
193 else if (GetComponentType() == itk::ImageIOBase::FLOAT) dataTypeName = "float";
194 else if (GetComponentType() == itk::ImageIOBase::DOUBLE) dataTypeName = "double";
196 itkExceptionMacro(<<"Write failed: Wanted pixel type "
197 << "(char, uchar, short, ushort, int, uint, float, double)"
198 << " but Vox is : " << dataTypeName);
200 file << dataTypeName << std::endl;
203 if (!keepOfStream) file.close();
206 //--------------------------------------------------------------------
207 // Write Image Information
208 bool clitk::VoxImageIO::CanWriteFile(const char* FileNameToWrite)
210 std::string filename(FileNameToWrite);
211 std::string filenameext = GetExtension(filename);
212 if (filenameext != std::string("vox")) return false;
216 //--------------------------------------------------------------------
218 void clitk::VoxImageIO::Write(const void * buffer)
220 clitk::VoxImageIO::WriteImageInformation(true);
221 SetByteOrderToLittleEndian();
223 //-------------------------------------------
224 // Cut & Paste from itkRawImageIO
225 // (warning BigEndian / LittleEndian)
226 const unsigned long numberOfBytes = this->GetImageSizeInBytes();
227 const unsigned long numberOfComponents = this->GetImageSizeInComponents();
228 // Swap bytes if necessary
230 if itkWriteRawBytesAfterSwappingMacro( unsigned short, USHORT )
231 else if itkWriteRawBytesAfterSwappingMacro( short, SHORT )
232 else if itkWriteRawBytesAfterSwappingMacro( char, CHAR )
233 else if itkWriteRawBytesAfterSwappingMacro( unsigned char, UCHAR )
234 else if itkWriteRawBytesAfterSwappingMacro( unsigned int, UINT )
235 else if itkWriteRawBytesAfterSwappingMacro( int, INT )
236 else if itkWriteRawBytesAfterSwappingMacro( float, FLOAT )
237 else if itkWriteRawBytesAfterSwappingMacro( double, DOUBLE ) ;
238 //-------------------------------------------
243 #endif /* end #define CLITKVOXIMAGEIO_CXX */