2 /*-------------------------------------------------------------------------
5 Module: $RCSfile: clitkVoxImageIO.cxx,v $
7 Date: $Date: 2010/01/06 13:32:01 $
8 Version: $Revision: 1.1 $
10 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
11 l'Image). All rights reserved. See Doc/License.txt or
12 http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
14 This software is distributed WITHOUT ANY WARRANTY; without even
15 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 PURPOSE. See the above copyright notices for more information.
18 -------------------------------------------------------------------------*/
21 #ifndef CLITKVOXIMAGEIO_CXX
22 #define CLITKVOXIMAGEIO_CXX
25 -------------------------------------------------
26 * @file clitkVoxImageIO.cxx
27 * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
28 * @date 17 May 2006 08:03:07
33 -------------------------------------------------*/
36 #include "clitkVoxImageIO.h"
37 #include "clitkCommon.h"
39 // itk include (for itkReadRawBytesAfterSwappingMacro)
40 #include "itkRawImageIO.h"
42 //--------------------------------------------------------------------
43 // Read Image Information
44 void clitk::VoxImageIO::ReadImageInformation() {
47 clitk::openFileForReading(is, m_FileName);
53 itkExceptionMacro(<<"read magic number '" << mn << "' while expect VOX");
55 // read vox file version
60 itkExceptionMacro(<<"read old format '" << mn << "'. TODO");
63 // ONLY 3D IMAGES YET ...
65 // read grid size/spacing
66 itk::Vector<unsigned int,3> dim;
67 itk::Vector<double,3> spacing;
68 itk::Vector<double,3> origin;
83 if (d != 3 && d != 2) {
84 itkExceptionMacro(<<"could not read no " << d << "D image (only 2D and 3D). TODO");
88 std::string dataTypeName;
93 m_HeaderSize = is.tellg();
97 // set dimension values
98 SetNumberOfDimensions(d);
99 for(int i=0; i<d; i++) {
100 SetDimensions(i,dim[i]);
101 SetSpacing(i,spacing[i]);
102 SetOrigin(i,origin[i]);
105 // set other information
106 SetByteOrderToLittleEndian();
107 SetPixelType(itk::ImageIOBase::SCALAR);
108 SetNumberOfComponents(1);
110 if (dataTypeName == "char") SetComponentType(itk::ImageIOBase::CHAR);
111 else if (dataTypeName == "schar") SetComponentType(itk::ImageIOBase::CHAR);
112 else if (dataTypeName == "uchar" || dataTypeName == "unsigned_char") SetComponentType(itk::ImageIOBase::UCHAR);
113 else if (dataTypeName == "sshort") SetComponentType(itk::ImageIOBase::SHORT);
114 else if (dataTypeName == "ushort") SetComponentType(itk::ImageIOBase::USHORT);
115 else if (dataTypeName == "int") SetComponentType(itk::ImageIOBase::INT);
116 else if (dataTypeName == "sint") SetComponentType(itk::ImageIOBase::INT);
117 else if (dataTypeName == "uint") SetComponentType(itk::ImageIOBase::UINT);
118 else if (dataTypeName == "float") SetComponentType(itk::ImageIOBase::FLOAT);
119 else if (dataTypeName == "double") SetComponentType(itk::ImageIOBase::DOUBLE);
121 itkExceptionMacro(<<"Read failed: Wanted pixel type "
122 << "(char, uchar, short, ushort, int, uint, float, double)"
123 << " but read " << dataTypeName);
128 //--------------------------------------------------------------------
129 // Read Image Information
130 bool clitk::VoxImageIO::CanReadFile(const char* FileNameToRead)
132 std::string filename(FileNameToRead);
133 std::string filenameext = GetExtension(filename);
134 if (filenameext != std::string("vox")) return false;
138 //--------------------------------------------------------------------
139 // Read Image Content
140 void clitk::VoxImageIO::Read(void * buffer)
142 // Adapted from itkRawImageIO
145 openFileForReading(file, m_FileName);
148 unsigned long streamStart = m_HeaderSize;
149 file.seekg((long)streamStart, std::ios::beg);
151 itkExceptionMacro(<<"File seek failed (Vox Read)");
154 unsigned long numberOfBytesToBeRead = GetComponentSize();
155 for(unsigned int i=0; i<GetNumberOfDimensions(); i++) numberOfBytesToBeRead *= GetDimensions(i);
157 //DD(numberOfBytesToBeRead);
159 if(!this->ReadBufferAsBinary(file, buffer, numberOfBytesToBeRead)) {
160 itkExceptionMacro(<<"Read failed: Wanted "
161 << numberOfBytesToBeRead
162 << " bytes, but read "
163 << file.gcount() << " bytes.");
165 itkDebugMacro(<< "Reading Done");
169 // Swap bytes if necessary
170 if itkReadRawBytesAfterSwappingMacro( unsigned short, USHORT )
171 else if itkReadRawBytesAfterSwappingMacro( short, SHORT )
172 else if itkReadRawBytesAfterSwappingMacro( char, CHAR )
173 else if itkReadRawBytesAfterSwappingMacro( unsigned char, UCHAR )
174 else if itkReadRawBytesAfterSwappingMacro( unsigned int, UINT )
175 else if itkReadRawBytesAfterSwappingMacro( int, INT )
176 else if itkReadRawBytesAfterSwappingMacro( float, FLOAT )
177 else if itkReadRawBytesAfterSwappingMacro( double, DOUBLE );
181 //--------------------------------------------------------------------
182 // Write Image Information
183 void clitk::VoxImageIO::WriteImageInformation(bool keepOfStream)
186 if (GetNumberOfDimensions() != 3 && GetNumberOfDimensions() != 2) {
187 itkExceptionMacro(<<"Write failed: only 3D and 2D image for Vox file format yet.");
191 clitk::openFileForWriting(file, m_FileName);
192 // write magic number
193 file << "VOX v2" << std::endl;
194 // write grid size/spacing
195 file << "# Size" << std::endl;
196 file << GetDimensions(0) << " "
197 << GetDimensions(1) << " "
198 << GetDimensions(2) << std::endl;
199 file << "# Spacing" << std::endl;
201 file << GetSpacing(0) << " "
202 << GetSpacing(1) << " "
203 << GetSpacing(2) << std::endl;
204 file << "# Image dim" << std::endl << "3" << std::endl;
205 file << "# Image type" << std::endl;
207 std::string dataTypeName;
208 if (GetComponentType() == itk::ImageIOBase::CHAR) dataTypeName = "schar";
209 else if (GetComponentType() == itk::ImageIOBase::UCHAR) dataTypeName = "uchar";
210 else if (GetComponentType() == itk::ImageIOBase::SHORT) dataTypeName = "sshort";
211 else if (GetComponentType() == itk::ImageIOBase::USHORT) dataTypeName = "ushort";
212 else if (GetComponentType() == itk::ImageIOBase::INT) dataTypeName = "int";
213 else if (GetComponentType() == itk::ImageIOBase::UINT) dataTypeName = "uint";
214 else if (GetComponentType() == itk::ImageIOBase::FLOAT) dataTypeName = "float";
215 else if (GetComponentType() == itk::ImageIOBase::DOUBLE) dataTypeName = "double";
217 itkExceptionMacro(<<"Write failed: Wanted pixel type "
218 << "(char, uchar, short, ushort, int, uint, float, double)"
219 << " but Vox is : " << dataTypeName);
221 file << dataTypeName << std::endl;
224 if (!keepOfStream) file.close();
227 //--------------------------------------------------------------------
228 // Write Image Information
229 bool clitk::VoxImageIO::CanWriteFile(const char* FileNameToWrite)
231 std::string filename(FileNameToWrite);
232 std::string filenameext = GetExtension(filename);
233 if (filenameext != std::string("vox")) return false;
237 //--------------------------------------------------------------------
239 void clitk::VoxImageIO::Write(const void * buffer)
241 clitk::VoxImageIO::WriteImageInformation(true);
242 SetByteOrderToLittleEndian();
244 //-------------------------------------------
245 // Cut & Paste from itkRawImageIO
246 // (warning BigEndian / LittleEndian)
247 const unsigned long numberOfBytes = this->GetImageSizeInBytes();
248 const unsigned long numberOfComponents = this->GetImageSizeInComponents();
249 // Swap bytes if necessary
251 if itkWriteRawBytesAfterSwappingMacro( unsigned short, USHORT )
252 else if itkWriteRawBytesAfterSwappingMacro( short, SHORT )
253 else if itkWriteRawBytesAfterSwappingMacro( char, CHAR )
254 else if itkWriteRawBytesAfterSwappingMacro( unsigned char, UCHAR )
255 else if itkWriteRawBytesAfterSwappingMacro( unsigned int, UINT )
256 else if itkWriteRawBytesAfterSwappingMacro( int, INT )
257 else if itkWriteRawBytesAfterSwappingMacro( float, FLOAT )
258 else if itkWriteRawBytesAfterSwappingMacro( double, DOUBLE ) ;
259 //-------------------------------------------
264 #endif /* end #define CLITKVOXIMAGEIO_CXX */