1 #include "ImageReader.h"
2 #include <cpPlugins/Interface/Image.h>
6 #include <itkImageFileReader.h>
7 #include <itkImageSeriesReader.h>
9 // -------------------------------------------------------------------------
10 cpPlugins::IO::ImageReader::
14 this->m_ClassName = "cpPlugins::IO::ImageReader";
15 this->m_ClassCategory = "ImageReader";
17 this->SetNumberOfOutputs( 1 );
18 this->_MakeOutput< cpPlugins::Interface::Image >( 0 );
20 using namespace cpPlugins::Interface;
21 this->m_DefaultParameters.Configure( Parameters::StringList, "FileNames" );
22 this->m_DefaultParameters.Configure( Parameters::Bool, "VectorType" );
23 this->m_DefaultParameters.SetValueAsBool( "VectorType", false );
24 this->m_Parameters = this->m_DefaultParameters;
27 // -------------------------------------------------------------------------
28 cpPlugins::IO::ImageReader::
33 // -------------------------------------------------------------------------
34 std::string cpPlugins::IO::ImageReader::
39 this->m_Parameters.GetValueAsStringList( names, "FileNames" );
42 if( names.size( ) >= 1 )
44 // Guess image properties
45 itk::ImageIOBase::Pointer io =
46 itk::ImageIOFactory::CreateImageIO(
48 itk::ImageIOFactory::ReadMode
52 io->SetFileName( names[ 0 ] );
53 io->ReadImageInformation( );
54 if( names.size( ) >= 1 )
56 switch( io->GetNumberOfDimensions( ) )
58 case 2: r = this->_GD0< 2 >( io, names ); break;
59 case 3: r = this->_GD0< 3 >( io, names ); break;
60 case 4: r = this->_GD0< 4 >( io, names ); break;
62 r = "ImageReader: Image dimension not supported.";
69 r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\"";
72 r = "No image files given";
76 // -------------------------------------------------------------------------
77 template< unsigned int D >
78 std::string cpPlugins::IO::ImageReader::
79 _GD0( itk::ImageIOBase* io, const TStringList& names )
81 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
82 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
85 if( pt == itk::ImageIOBase::SCALAR )
89 case itk::ImageIOBase::UCHAR:
90 r = this->_GD1< unsigned char, D >( names );
92 case itk::ImageIOBase::CHAR:
93 r = this->_GD1< char, D >( names );
95 case itk::ImageIOBase::USHORT:
96 r = this->_GD1< unsigned short, D >( names );
98 case itk::ImageIOBase::SHORT:
99 r = this->_GD1< short, D >( names );
101 case itk::ImageIOBase::UINT:
102 r = this->_GD1< unsigned int, D >( names );
104 case itk::ImageIOBase::INT:
105 r = this->_GD1< int, D >( names );
107 case itk::ImageIOBase::ULONG:
108 r = this->_GD1< unsigned long, D >( names );
110 case itk::ImageIOBase::LONG:
111 r = this->_GD1< long, D >( names );
113 case itk::ImageIOBase::FLOAT:
114 r = this->_GD1< float, D >( names );
116 case itk::ImageIOBase::DOUBLE:
117 r = this->_GD1< double, D >( names );
120 r = "ImageReader: Scalar pixel type not supported.";
124 else if( pt == itk::ImageIOBase::RGB )
128 case itk::ImageIOBase::UCHAR:
129 r = this->_GD1< itk::RGBPixel< unsigned char >, D >( names );
131 case itk::ImageIOBase::CHAR:
132 r = this->_GD1< itk::RGBPixel< char >, D >( names );
134 case itk::ImageIOBase::USHORT:
135 r = this->_GD1< itk::RGBPixel< unsigned short >, D >( names );
137 case itk::ImageIOBase::SHORT:
138 r = this->_GD1< itk::RGBPixel< short >, D >( names );
140 case itk::ImageIOBase::UINT:
141 r = this->_GD1< itk::RGBPixel< unsigned int >, D >( names );
143 case itk::ImageIOBase::INT:
144 r = this->_GD1< itk::RGBPixel< int >, D >( names );
146 case itk::ImageIOBase::ULONG:
147 r = this->_GD1< itk::RGBPixel< unsigned long >, D >( names );
149 case itk::ImageIOBase::LONG:
150 r = this->_GD1< itk::RGBPixel< long >, D >( names );
152 case itk::ImageIOBase::FLOAT:
153 r = this->_GD1< itk::RGBPixel< float >, D >( names );
155 case itk::ImageIOBase::DOUBLE:
156 r = this->_GD1< itk::RGBPixel< double >, D >( names );
159 r = "ImageReader: RGB pixel type not supported.";
163 else if( pt == itk::ImageIOBase::RGBA )
167 case itk::ImageIOBase::UCHAR:
168 r = this->_GD1< itk::RGBAPixel< unsigned char >, D >( names );
170 case itk::ImageIOBase::CHAR:
171 r = this->_GD1< itk::RGBAPixel< char >, D >( names );
173 case itk::ImageIOBase::USHORT:
174 r = this->_GD1< itk::RGBAPixel< unsigned short >, D >( names );
176 case itk::ImageIOBase::SHORT:
177 r = this->_GD1< itk::RGBAPixel< short >, D >( names );
179 case itk::ImageIOBase::UINT:
180 r = this->_GD1< itk::RGBAPixel< unsigned int >, D >( names );
182 case itk::ImageIOBase::INT:
183 r = this->_GD1< itk::RGBAPixel< int >, D >( names );
185 case itk::ImageIOBase::ULONG:
186 r = this->_GD1< itk::RGBAPixel< unsigned long >, D >( names );
188 case itk::ImageIOBase::LONG:
189 r = this->_GD1< itk::RGBAPixel< long >, D >( names );
191 case itk::ImageIOBase::FLOAT:
192 r = this->_GD1< itk::RGBAPixel< float >, D >( names );
194 case itk::ImageIOBase::DOUBLE:
195 r = this->_GD1< itk::RGBAPixel< double >, D >( names );
198 r = "ImageReader: RGBA pixel type not supported.";
202 else if( pt == itk::ImageIOBase::VECTOR )
206 case itk::ImageIOBase::FLOAT:
207 r = this->_GD1< itk::Vector< float, D >, D >( names );
209 case itk::ImageIOBase::DOUBLE:
210 r = this->_GD1< itk::Vector< double, D >, D >( names );
213 r = "ImageReader: Vector type not supported.";
217 else if( pt == itk::ImageIOBase::POINT )
221 case itk::ImageIOBase::FLOAT:
222 r = this->_GD1< itk::Point< float, D >, D >( names );
224 case itk::ImageIOBase::DOUBLE:
225 r = this->_GD1< itk::Point< double, D >, D >( names );
228 r = "ImageReader: Point type not supported.";
232 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
236 case itk::ImageIOBase::FLOAT:
237 r = this->_GD1< itk::CovariantVector< float, D >, D >( names );
239 case itk::ImageIOBase::DOUBLE:
240 r = this->_GD1< itk::CovariantVector< double, D >, D >( names );
243 r = "ImageReader: CovariantVector type not supported.";
247 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
251 case itk::ImageIOBase::FLOAT:
253 this->_GD1< itk::SymmetricSecondRankTensor< float, D >, D >(
257 case itk::ImageIOBase::DOUBLE:
259 this->_GD1< itk::SymmetricSecondRankTensor< double, D >, D >(
264 r = "ImageReader: Vector type not supported.";
268 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
272 case itk::ImageIOBase::FLOAT:
273 r = this->_GD1< itk::DiffusionTensor3D< float >, D >( names );
275 case itk::ImageIOBase::DOUBLE:
276 r = this->_GD1< itk::DiffusionTensor3D< double >, D >( names );
279 r = "ImageReader: Diffusion tensor type not supported.";
283 else if( pt == itk::ImageIOBase::COMPLEX )
287 case itk::ImageIOBase::FLOAT:
288 r = this->_GD1< std::complex< float >, D >( names );
290 case itk::ImageIOBase::DOUBLE:
291 r = this->_GD1< std::complex< double >, D >( names );
294 r = "ImageReader: Complex type not supported.";
298 else if( pt == itk::ImageIOBase::OFFSET )
299 r = this->_GD1< itk::Offset< D >, D >( names );
301 r = "ImageReader: Image pixel type not yet supported.";
303 itk::ImageIOBase::FIXEDARRAY
304 itk::ImageIOBase::MATRIX
309 // -------------------------------------------------------------------------
310 template< class P, unsigned int D >
311 std::string cpPlugins::IO::ImageReader::
312 _GD1( const TStringList& names )
314 if( this->m_Parameters.GetValueAsBool( "VectorType" ) )
315 return( this->_RealGD< itk::VectorImage< P, D > >( names ) );
317 return( this->_RealGD< itk::Image< P, D > >( names ) );
320 // -------------------------------------------------------------------------
322 std::string cpPlugins::IO::ImageReader::
323 _RealGD( const TStringList& names )
325 cpPlugins::Interface::Image* out =
326 this->GetOutput< cpPlugins::Interface::Image >( 0 );
328 return( "ImageReader: No output object properly created." );
331 if( names.size( ) == 1 )
334 typedef itk::ImageFileReader< I > _SR;
336 dynamic_cast< _SR* >( this->m_RealProcessObject.GetPointer( ) );
339 this->m_RealProcessObject = _SR::New( );
341 dynamic_cast< _SR* >( this->m_RealProcessObject.GetPointer( ) );
344 reader->SetFileName( names[ 0 ] );
348 out->SetITKImage< I >( reader->GetOutput( ) );
350 catch( itk::ExceptionObject& err )
352 r = "ImageReader: " + std::string( err.GetDescription( ) );
353 out->SetITKImage< I >( NULL );
357 else if( names.size( ) > 1 )
360 std::set< std::string > ordered_names;
361 for( unsigned int i = 0; i < names.size( ); ++i )
362 ordered_names.insert( names[ i ] );
364 typedef itk::ImageSeriesReader< I > _MR;
366 dynamic_cast< _MR* >( this->m_RealProcessObject.GetPointer( ) );
369 this->m_RealProcessObject = _MR::New( );
371 dynamic_cast< _MR* >( this->m_RealProcessObject.GetPointer( ) );
374 std::set< std::string >::const_iterator fnIt = ordered_names.begin( );
375 for( ; fnIt != ordered_names.end( ); ++fnIt )
377 reader->AddFileName( *fnIt );
382 out->SetITKImage< I >( reader->GetOutput( ) );
384 catch( itk::ExceptionObject& err )
386 r = "ImageReader: " + std::string( err.GetDescription( ) );
387 out->SetITKImage< I >( NULL );
392 r = "ImageReader: No image files given";