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 CLITKVOXIMAGEIO_CXX
19 #define CLITKVOXIMAGEIO_CXX
21 -------------------------------------------------
22 * @file clitkVoxImageIO.cxx
23 * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
24 * @date 17 May 2006 08:03:07
29 -------------------------------------------------*/
32 #include "clitkVoxImageIO.h"
33 #include "clitkCommon.h"
35 // itk include (for itkReadRawBytesAfterSwappingMacro)
36 #include "itkRawImageIO.h"
38 //--------------------------------------------------------------------
39 // Read Image Information
40 void clitk::VoxImageIO::ReadImageInformation() {
43 clitk::openFileForReading(is, m_FileName);
49 itkExceptionMacro(<<"read magic number '" << mn << "' while expect VOX");
51 // read vox file version
56 itkExceptionMacro(<<"read old format '" << mn << "'. TODO");
59 // ONLY 3D IMAGES YET ...
61 // read grid size/spacing
62 itk::Vector<unsigned int,3> dim;
63 itk::Vector<double,3> spacing;
64 itk::Vector<double,3> origin;
79 if (d != 3 && d != 2) {
80 itkExceptionMacro(<<"could not read no " << d << "D image (only 2D and 3D). TODO");
84 std::string dataTypeName;
89 m_HeaderSize = is.tellg();
93 // set dimension values
94 SetNumberOfDimensions(d);
95 for(int i=0; i<d; i++) {
96 SetDimensions(i,dim[i]);
97 SetSpacing(i,spacing[i]);
98 SetOrigin(i,origin[i]);
101 // set other information
102 SetByteOrderToLittleEndian();
103 SetPixelType(itk::ImageIOBase::SCALAR);
104 SetNumberOfComponents(1);
106 if (dataTypeName == "char") SetComponentType(itk::ImageIOBase::CHAR);
107 else if (dataTypeName == "schar") SetComponentType(itk::ImageIOBase::CHAR);
108 else if (dataTypeName == "uchar" || dataTypeName == "unsigned_char") SetComponentType(itk::ImageIOBase::UCHAR);
109 else if (dataTypeName == "sshort") SetComponentType(itk::ImageIOBase::SHORT);
110 else if (dataTypeName == "ushort") SetComponentType(itk::ImageIOBase::USHORT);
111 else if (dataTypeName == "int") SetComponentType(itk::ImageIOBase::INT);
112 else if (dataTypeName == "sint") SetComponentType(itk::ImageIOBase::INT);
113 else if (dataTypeName == "uint") SetComponentType(itk::ImageIOBase::UINT);
114 else if (dataTypeName == "float") SetComponentType(itk::ImageIOBase::FLOAT);
115 else if (dataTypeName == "double") SetComponentType(itk::ImageIOBase::DOUBLE);
117 itkExceptionMacro(<<"Read failed: Wanted pixel type "
118 << "(char, uchar, short, ushort, int, uint, float, double)"
119 << " but read " << dataTypeName);
124 //--------------------------------------------------------------------
125 // Read Image Information
126 bool clitk::VoxImageIO::CanReadFile(const char* FileNameToRead)
128 std::string filename(FileNameToRead);
129 std::string filenameext = GetExtension(filename);
130 if (filenameext != std::string("vox")) return false;
134 //--------------------------------------------------------------------
135 // Read Image Content
136 void clitk::VoxImageIO::Read(void * buffer)
138 // Adapted from itkRawImageIO
141 openFileForReading(file, m_FileName);
144 unsigned long streamStart = m_HeaderSize;
145 file.seekg((long)streamStart, std::ios::beg);
147 itkExceptionMacro(<<"File seek failed (Vox Read)");
150 unsigned long numberOfBytesToBeRead = GetComponentSize();
151 for(unsigned int i=0; i<GetNumberOfDimensions(); i++) numberOfBytesToBeRead *= GetDimensions(i);
153 //DD(numberOfBytesToBeRead);
155 if(!this->ReadBufferAsBinary(file, buffer, numberOfBytesToBeRead)) {
156 itkExceptionMacro(<<"Read failed: Wanted "
157 << numberOfBytesToBeRead
158 << " bytes, but read "
159 << file.gcount() << " bytes.");
161 itkDebugMacro(<< "Reading Done");
165 // Swap bytes if necessary
166 if itkReadRawBytesAfterSwappingMacro( unsigned short, USHORT )
167 else if itkReadRawBytesAfterSwappingMacro( short, SHORT )
168 else if itkReadRawBytesAfterSwappingMacro( char, CHAR )
169 else if itkReadRawBytesAfterSwappingMacro( unsigned char, UCHAR )
170 else if itkReadRawBytesAfterSwappingMacro( unsigned int, UINT )
171 else if itkReadRawBytesAfterSwappingMacro( int, INT )
172 else if itkReadRawBytesAfterSwappingMacro( float, FLOAT )
173 else if itkReadRawBytesAfterSwappingMacro( double, DOUBLE );
177 //--------------------------------------------------------------------
178 // Write Image Information
179 void clitk::VoxImageIO::WriteImageInformation(bool keepOfStream)
182 if (GetNumberOfDimensions() != 3 && GetNumberOfDimensions() != 2) {
183 itkExceptionMacro(<<"Write failed: only 3D and 2D image for Vox file format yet.");
187 clitk::openFileForWriting(file, m_FileName);
188 // write magic number
189 file << "VOX v2" << std::endl;
190 // write grid size/spacing
191 file << "# Size" << std::endl;
192 file << GetDimensions(0) << " "
193 << GetDimensions(1) << " "
194 << GetDimensions(2) << std::endl;
195 file << "# Spacing" << std::endl;
197 file << GetSpacing(0) << " "
198 << GetSpacing(1) << " "
199 << GetSpacing(2) << std::endl;
200 file << "# Image dim" << std::endl << "3" << std::endl;
201 file << "# Image type" << std::endl;
203 std::string dataTypeName;
204 if (GetComponentType() == itk::ImageIOBase::CHAR) dataTypeName = "schar";
205 else if (GetComponentType() == itk::ImageIOBase::UCHAR) dataTypeName = "uchar";
206 else if (GetComponentType() == itk::ImageIOBase::SHORT) dataTypeName = "sshort";
207 else if (GetComponentType() == itk::ImageIOBase::USHORT) dataTypeName = "ushort";
208 else if (GetComponentType() == itk::ImageIOBase::INT) dataTypeName = "int";
209 else if (GetComponentType() == itk::ImageIOBase::UINT) dataTypeName = "uint";
210 else if (GetComponentType() == itk::ImageIOBase::FLOAT) dataTypeName = "float";
211 else if (GetComponentType() == itk::ImageIOBase::DOUBLE) dataTypeName = "double";
213 itkExceptionMacro(<<"Write failed: Wanted pixel type "
214 << "(char, uchar, short, ushort, int, uint, float, double)"
215 << " but Vox is : " << dataTypeName);
217 file << dataTypeName << std::endl;
220 if (!keepOfStream) file.close();
223 //--------------------------------------------------------------------
224 // Write Image Information
225 bool clitk::VoxImageIO::CanWriteFile(const char* FileNameToWrite)
227 std::string filename(FileNameToWrite);
228 std::string filenameext = GetExtension(filename);
229 if (filenameext != std::string("vox")) return false;
233 //--------------------------------------------------------------------
235 void clitk::VoxImageIO::Write(const void * buffer)
237 clitk::VoxImageIO::WriteImageInformation(true);
238 SetByteOrderToLittleEndian();
240 //-------------------------------------------
241 // Cut & Paste from itkRawImageIO
242 // (warning BigEndian / LittleEndian)
243 const unsigned long numberOfBytes = this->GetImageSizeInBytes();
244 const unsigned long numberOfComponents = this->GetImageSizeInComponents();
245 // Swap bytes if necessary
247 if itkWriteRawBytesAfterSwappingMacro( unsigned short, USHORT )
248 else if itkWriteRawBytesAfterSwappingMacro( short, SHORT )
249 else if itkWriteRawBytesAfterSwappingMacro( char, CHAR )
250 else if itkWriteRawBytesAfterSwappingMacro( unsigned char, UCHAR )
251 else if itkWriteRawBytesAfterSwappingMacro( unsigned int, UINT )
252 else if itkWriteRawBytesAfterSwappingMacro( int, INT )
253 else if itkWriteRawBytesAfterSwappingMacro( float, FLOAT )
254 else if itkWriteRawBytesAfterSwappingMacro( double, DOUBLE ) ;
255 //-------------------------------------------
260 #endif /* end #define CLITKVOXIMAGEIO_CXX */