1 #ifndef CLITKVFIMAGEIO_CXX
2 #define CLITKVFIMAGEIO_CXX
5 * @file clitkVfImageIO.cxx
6 * @author Simon Rit <simon.rit@gmail.com>
7 * @date Mon Sep 18 10:14:53 2006
9 * @brief VectorField .vf I/O implementation
15 #include "clitkVfImageIO.h"
17 // itk include (for itkReadRawBytesAfterSwappingMacro)
18 #include "itkRawImageIO.h"
20 //====================================================================
21 // Read Image Information
22 void clitk::VfImageIO::ReadImageInformation()
26 clitk::openFileForReading(is, m_FileName);
31 if (mn != "IAMA3DVECTORFIELD") {
32 itkExceptionMacro(<<"read magic number '" << mn << "' while expect IAMA3DVECTORFIELD");
34 // read vf file version
39 itkExceptionMacro(<<"read old format '" << mn << "'. TODO");
42 // read grid size/spacing
43 itk::Vector<unsigned int,3> dim;
44 itk::Vector<double,3> spacing;
45 itk::Vector<double,3> origin;
58 m_HeaderSize = is.tellg();
61 // set dimension values
62 SetNumberOfDimensions(3);
63 for(unsigned int i=0; i<3; i++) {
64 SetDimensions(i,dim[i]);
65 SetSpacing(i,spacing[i]);
66 SetOrigin(i,origin[i]);
69 // set other information
70 SetByteOrderToLittleEndian();
71 SetPixelType(itk::ImageIOBase::VECTOR);
72 SetNumberOfComponents(3);
73 SetComponentType(itk::ImageIOBase::FLOAT);
76 //====================================================================
77 // Read Image Information
78 bool clitk::VfImageIO::CanReadFile(const char* FileNameToRead)
80 std::string filename(FileNameToRead);
81 std::string filenameext = GetExtension(filename);
82 if (filenameext != std::string("vf")) return false;
86 //====================================================================
88 void clitk::VfImageIO::Read(void * buffer)
90 // Adapted from itkRawImageIO
93 openFileForReading(file, m_FileName);
96 unsigned long streamStart = m_HeaderSize;
97 file.seekg((long)streamStart, std::ios::beg);
99 itkExceptionMacro(<<"File seek failed (Vf Read)");
102 float * tmpBuff = new float[GetImageSizeInComponents()];
103 if(!this->ReadBufferAsBinary(file, tmpBuff, GetImageSizeInBytes())) {
104 itkExceptionMacro(<<"Read failed: Wanted "
105 << GetImageSizeInBytes()
106 << " bytes, but read "
107 << file.gcount() << " bytes.");
109 itkDebugMacro(<< "Reading Done");
111 float *pb = (float *)buffer;
113 float *py = tmpBuff + GetImageSizeInPixels();
114 float *pz = tmpBuff + 2 * GetImageSizeInPixels();
115 const float *pbe = (float *)buffer + GetImageSizeInComponents();
117 *pb++ = (*px++)*GetSpacing(0);
118 *pb++ = (*py++)*GetSpacing(1);
119 *pb++ = (*pz++)*GetSpacing(2);
123 typedef itk::ByteSwapper< float > InternalByteSwapperType;
124 InternalByteSwapperType::SwapRangeFromSystemToLittleEndian((float *)buffer, GetImageSizeInComponents());
127 //====================================================================
128 // Write Image Information
129 void clitk::VfImageIO::WriteImageInformation(bool keepOfStream)
132 if (GetNumberOfDimensions() != 3) {
133 itkExceptionMacro(<<"Write failed: only 3D image for Vf file format yet.");
137 clitk::openFileForWriting(file, m_FileName);
138 // write magic number
139 file << "IAMA3DVECTORFIELD V2 " << std::endl;
140 // write grid size/spacing
141 file << GetDimensions(0) << ' '
142 << GetDimensions(1) << ' '
143 << GetDimensions(2) << ' '
144 << GetSpacing(0) << ' '
145 << GetSpacing(1) << ' '
146 << GetSpacing(2) << ' ' << std::endl;
149 if (!keepOfStream) file.close();
152 //====================================================================
153 // Write Image Information
154 bool clitk::VfImageIO::CanWriteFile(const char* FileNameToWrite)
156 std::string filename(FileNameToWrite);
157 std::string filenameext = GetExtension(filename);
158 if (filenameext != std::string("vf")) return false;
162 //====================================================================
164 void clitk::VfImageIO::Write(const void * buffer)
166 clitk::VfImageIO::WriteImageInformation(true);
168 typedef itk::ByteSwapper< float > InternalByteSwapperType;
169 std::cout << "GetImageSizeInBytes() " << GetImageSizeInBytes() << std::endl;
170 float* tempBuffer = new float[ GetImageSizeInPixels() ];
173 for(int i=0 ; i< 3 ; i++){
174 float *pb = (float *)buffer;
176 float *ptb = tempBuffer;
177 const float *pbe = (float *)buffer + GetImageSizeInComponents() + i;
179 *ptb++ = (*pb)/GetSpacing(i);
182 InternalByteSwapperType::SwapRangeFromSystemToLittleEndian(tempBuffer,GetImageSizeInPixels());
183 file.write((char*)tempBuffer, GetImageSizeInBytes()/3 );
185 delete [] tempBuffer;
190 #endif /* end #define CLITKVFIMAGEIO_CXX */