1 #include <cpPlugins/Plugins/ImageReader.h>
2 #include <cpPlugins/Interface/Image.h>
7 #define ITK_MANUAL_INSTANTIATION
10 #include <itkCovariantVector.h>
11 #include <itkDiffusionTensor3D.h>
13 #include <itkRGBPixel.h>
14 #include <itkRGBAPixel.h>
15 #include <itkSymmetricSecondRankTensor.h>
16 #include <itkVector.h>
18 #undef ITK_MANUAL_INSTANTIATION
19 #include <itkImageFileReader.h>
20 #include <itkImageSeriesReader.h>
22 // -------------------------------------------------------------------------
23 cpPlugins::Plugins::ImageReader::
27 this->m_ClassName = "cpPlugins::ImageReader";
28 this->m_ClassCategory = "ImageReader";
30 this->SetNumberOfOutputs( 1 );
31 this->_MakeOutput< cpPlugins::Interface::Image >( 0 );
33 using namespace cpPlugins::Interface;
34 this->m_DefaultParameters.Configure( Parameters::StringList, "FileNames" );
35 this->m_Parameters = this->m_DefaultParameters;
38 // -------------------------------------------------------------------------
39 cpPlugins::Plugins::ImageReader::
44 // -------------------------------------------------------------------------
45 std::string cpPlugins::Plugins::ImageReader::
50 this->m_Parameters.GetValueAsStringList( names, "FileNames" );
53 if( names.size( ) >= 1 )
55 // Guess image properties
56 itk::ImageIOBase::Pointer io =
57 itk::ImageIOFactory::CreateImageIO(
59 itk::ImageIOFactory::ReadMode
63 io->SetFileName( names[ 0 ] );
64 io->ReadImageInformation( );
65 if( names.size( ) == 1 )
67 switch( io->GetNumberOfDimensions( ) )
69 case 2: r = this->_GD0< 2 >( io, names ); break;
70 case 3: r = this->_GD0< 3 >( io, names ); break;
71 case 4: r = this->_GD0< 4 >( io, names ); break;
73 r = "ImageReader: Single image dimension not supported.";
77 else if( names.size( ) > 1 )
79 switch( io->GetNumberOfDimensions( ) )
81 case 1: r = this->_GD0< 2 >( io, names ); break;
82 case 2: r = this->_GD0< 3 >( io, names ); break;
83 case 3: r = this->_GD0< 4 >( io, names ); break;
85 r = "ImageReader: Multiple images dimension not supported.";
92 r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\"";
95 r = "No image files given";
99 // -------------------------------------------------------------------------
100 template< unsigned int D >
101 std::string cpPlugins::Plugins::ImageReader::
102 _GD0( itk::ImageIOBase* io, const TStringList& names )
104 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
105 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
108 if( pt == itk::ImageIOBase::SCALAR )
112 case itk::ImageIOBase::UCHAR:
113 r = this->_RealGD< unsigned char, D >( names );
115 case itk::ImageIOBase::CHAR:
116 r = this->_RealGD< char, D >( names );
118 case itk::ImageIOBase::USHORT:
119 r = this->_RealGD< unsigned short, D >( names );
121 case itk::ImageIOBase::SHORT:
122 r = this->_RealGD< short, D >( names );
124 case itk::ImageIOBase::UINT:
125 r = this->_RealGD< unsigned int, D >( names );
127 case itk::ImageIOBase::INT:
128 r = this->_RealGD< int, D >( names );
130 case itk::ImageIOBase::ULONG:
131 r = this->_RealGD< unsigned long, D >( names );
133 case itk::ImageIOBase::LONG:
134 r = this->_RealGD< long, D >( names );
136 case itk::ImageIOBase::FLOAT:
137 r = this->_RealGD< float, D >( names );
139 case itk::ImageIOBase::DOUBLE:
140 r = this->_RealGD< double, D >( names );
143 r = "ImageReader: Scalar pixel type not supported.";
147 else if( pt == itk::ImageIOBase::RGB )
153 case itk::ImageIOBase::UCHAR:
154 r = this->_RealGD< itk::RGBPixel< unsigned char >, 2 >( names );
156 case itk::ImageIOBase::CHAR:
157 r = this->_RealGD< itk::RGBPixel< char >, 2 >( names );
159 case itk::ImageIOBase::USHORT:
160 r = this->_RealGD< itk::RGBPixel< unsigned short >, 2 >( names );
162 case itk::ImageIOBase::SHORT:
163 r = this->_RealGD< itk::RGBPixel< short >, 2 >( names );
166 r = "ImageReader: Scalar pixel type not supported.";
174 case itk::ImageIOBase::UCHAR:
175 r = this->_RealGD< itk::RGBPixel< unsigned char >, 3 >( names );
177 case itk::ImageIOBase::CHAR:
178 r = this->_RealGD< itk::RGBPixel< char >, 3 >( names );
180 case itk::ImageIOBase::USHORT:
181 r = this->_RealGD< itk::RGBPixel< unsigned short >, 3 >( names );
183 case itk::ImageIOBase::SHORT:
184 r = this->_RealGD< itk::RGBPixel< short >, 3 >( names );
187 r = "ImageReader: Scalar pixel type not supported.";
195 case itk::ImageIOBase::UCHAR:
196 r = this->_RealGD< itk::RGBPixel< unsigned char >, 4 >( names );
198 case itk::ImageIOBase::CHAR:
199 r = this->_RealGD< itk::RGBPixel< char >, 4 >( names );
201 case itk::ImageIOBase::USHORT:
202 r = this->_RealGD< itk::RGBPixel< unsigned short >, 4 >( names );
204 case itk::ImageIOBase::SHORT:
205 r = this->_RealGD< itk::RGBPixel< short >, 4 >( names );
208 r = "ImageReader: Scalar pixel type not supported.";
214 else if( pt == itk::ImageIOBase::RGBA )
220 case itk::ImageIOBase::UCHAR:
221 r = this->_RealGD< itk::RGBAPixel< unsigned char >, 2 >( names );
223 case itk::ImageIOBase::CHAR:
224 r = this->_RealGD< itk::RGBAPixel< char >, 2 >( names );
226 case itk::ImageIOBase::USHORT:
227 r = this->_RealGD< itk::RGBAPixel< unsigned short >, 2 >( names );
229 case itk::ImageIOBase::SHORT:
230 r = this->_RealGD< itk::RGBAPixel< short >, 2 >( names );
233 r = "ImageReader: Scalar pixel type not supported.";
241 case itk::ImageIOBase::UCHAR:
242 r = this->_RealGD< itk::RGBAPixel< unsigned char >, 3 >( names );
244 case itk::ImageIOBase::CHAR:
245 r = this->_RealGD< itk::RGBAPixel< char >, 3 >( names );
247 case itk::ImageIOBase::USHORT:
248 r = this->_RealGD< itk::RGBAPixel< unsigned short >, 3 >( names );
250 case itk::ImageIOBase::SHORT:
251 r = this->_RealGD< itk::RGBAPixel< short >, 3 >( names );
254 r = "ImageReader: Scalar pixel type not supported.";
262 case itk::ImageIOBase::UCHAR:
263 r = this->_RealGD< itk::RGBAPixel< unsigned char >, 4 >( names );
265 case itk::ImageIOBase::CHAR:
266 r = this->_RealGD< itk::RGBAPixel< char >, 4 >( names );
268 case itk::ImageIOBase::USHORT:
269 r = this->_RealGD< itk::RGBAPixel< unsigned short >, 4 >( names );
271 case itk::ImageIOBase::SHORT:
272 r = this->_RealGD< itk::RGBAPixel< short >, 4 >( names );
275 r = "ImageReader: Scalar pixel type not supported.";
281 else if( pt == itk::ImageIOBase::OFFSET )
286 r = this->_RealGD< itk::Offset< 2 >, 2 >( names );
289 r = this->_RealGD< itk::Offset< 3 >, 3 >( names );
292 r = this->_RealGD< itk::Offset< 4 >, 4 >( names );
295 r = "ImageReader: Offset pixel dimension not supported.";
299 else if( pt == itk::ImageIOBase::VECTOR )
303 case itk::ImageIOBase::FLOAT:
304 r = this->_RealGD< itk::Vector< float, D >, D >( names );
306 case itk::ImageIOBase::DOUBLE:
307 r = this->_RealGD< itk::Vector< double, D >, D >( names );
310 r = "ImageReader: Vector type not supported.";
314 else if( pt == itk::ImageIOBase::POINT )
318 case itk::ImageIOBase::FLOAT:
319 r = this->_RealGD< itk::Point< float, D >, D >( names );
321 case itk::ImageIOBase::DOUBLE:
322 r = this->_RealGD< itk::Point< double, D >, D >( names );
325 r = "ImageReader: Point type not supported.";
329 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
333 case itk::ImageIOBase::FLOAT:
334 r = this->_RealGD< itk::CovariantVector< float, D >, D >( names );
336 case itk::ImageIOBase::DOUBLE:
337 r = this->_RealGD< itk::CovariantVector< double, D >, D >( names );
340 r = "ImageReader: Vector type not supported.";
344 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
348 case itk::ImageIOBase::FLOAT:
350 this->_RealGD< itk::SymmetricSecondRankTensor< float, D >, D >(
354 case itk::ImageIOBase::DOUBLE:
356 this->_RealGD< itk::SymmetricSecondRankTensor< double, D >, D >(
361 r = "ImageReader: Vector type not supported.";
365 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
371 case itk::ImageIOBase::FLOAT:
372 r = this->_RealGD< itk::DiffusionTensor3D< float >, 3 >( names );
374 case itk::ImageIOBase::DOUBLE:
375 r = this->_RealGD< itk::DiffusionTensor3D< double >, 3 >( names );
378 r = "ImageReader: Diffusion tensor type not supported.";
383 r = "ImageReader: Diffusion tensor dimension not supported.";
385 else if( pt == itk::ImageIOBase::COMPLEX )
389 case itk::ImageIOBase::FLOAT:
390 r = this->_RealGD< std::complex< float >, D >( names );
392 case itk::ImageIOBase::DOUBLE:
393 r = this->_RealGD< std::complex< double >, D >( names );
396 r = "ImageReader: Complex type not supported.";
401 r = "ImageReader: Image pixel type not yet supported.";
403 itk::ImageIOBase::FIXEDARRAY
404 itk::ImageIOBase::MATRIX
410 // -------------------------------------------------------------------------
411 template< class P, unsigned int D >
412 std::string cpPlugins::Plugins::ImageReader::
413 _RealGD( const TStringList& names )
415 typedef itk::Image< P, D > _I;
418 if( names.size( ) == 1 )
421 typedef itk::ImageFileReader< _I > _SR;
423 dynamic_cast< _SR* >( this->m_RealProcessObject.GetPointer( ) );
426 this->m_RealProcessObject = _SR::New( );
428 dynamic_cast< _SR* >( this->m_RealProcessObject.GetPointer( ) );
431 reader->SetFileName( names[ 0 ] );
435 cpPlugins::Interface::Image* out =
436 this->_Output< cpPlugins::Interface::Image >( 0 );
438 out->SetITKImage< _I >( reader->GetOutput( ) );
440 r = "ImageReader: output not correctly created.";
442 catch( itk::ExceptionObject& err )
444 r = "ImageReader: " + std::string( err.GetDescription( ) );
445 cpPlugins::Interface::Image* out =
446 this->_Output< cpPlugins::Interface::Image >( 0 );
448 out->SetITKImage< _I >( NULL );
450 r = "ImageReader: output not correctly created.";
454 else if( names.size( ) > 1 )
457 std::set< std::string > ordered_names;
458 for( unsigned int i = 0; i < names.size( ); ++i )
459 ordered_names.insert( names[ i ] );
461 typedef itk::ImageSeriesReader< _I > _MR;
463 dynamic_cast< _MR* >( this->m_RealProcessObject.GetPointer( ) );
466 this->m_RealProcessObject = _MR::New( );
468 dynamic_cast< _MR* >( this->m_RealProcessObject.GetPointer( ) );
471 std::set< std::string >::const_iterator fnIt = ordered_names.begin( );
472 for( ; fnIt != ordered_names.end( ); ++fnIt )
473 reader->AddFileName( *fnIt );
477 cpPlugins::Interface::Image* out =
478 this->_Output< cpPlugins::Interface::Image >( 0 );
480 out->SetITKImage< _I >( reader->GetOutput( ) );
482 r = "ImageReader: output not correctly created.";
484 catch( itk::ExceptionObject& err )
486 r = "ImageReader: " + std::string( err.GetDescription( ) );
487 cpPlugins::Interface::Image* out =
488 this->_Output< cpPlugins::Interface::Image >( 0 );
490 out->SetITKImage< _I >( NULL );
492 r = "ImageReader: output not correctly created.";
497 r = "ImageReader: No image files given";