1 #include <cpPlugins/Plugins/ImageReader.h>
2 #include <cpPlugins/Interface/Image.h>
6 #include <itkImageFileReader.h>
7 #include <itkImageSeriesReader.h>
9 // -------------------------------------------------------------------------
10 cpPlugins::Plugins::ImageReader::
14 this->m_ClassName = "cpPlugins::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_Parameters = this->m_DefaultParameters;
25 // -------------------------------------------------------------------------
26 cpPlugins::Plugins::ImageReader::
31 // -------------------------------------------------------------------------
32 std::string cpPlugins::Plugins::ImageReader::
37 this->m_Parameters.GetValueAsStringList( names, "FileNames" );
40 if( names.size( ) >= 1 )
42 // Guess image properties
43 itk::ImageIOBase::Pointer io =
44 itk::ImageIOFactory::CreateImageIO(
46 itk::ImageIOFactory::ReadMode
50 io->SetFileName( names[ 0 ] );
51 io->ReadImageInformation( );
52 if( names.size( ) == 1 )
54 switch( io->GetNumberOfDimensions( ) )
56 case 2: r = this->_GD0< 2 >( io, names ); break;
57 case 3: r = this->_GD0< 3 >( io, names ); break;
58 case 4: r = this->_GD0< 4 >( io, names ); break;
60 r = "ImageReader: Single image dimension not supported.";
64 else if( names.size( ) > 1 )
66 switch( io->GetNumberOfDimensions( ) )
68 case 1: r = this->_GD0< 2 >( io, names ); break;
69 case 2: r = this->_GD0< 3 >( io, names ); break;
70 case 3: r = this->_GD0< 4 >( io, names ); break;
72 r = "ImageReader: Multiple images dimension not supported.";
79 r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\"";
82 r = "No image files given";
86 // -------------------------------------------------------------------------
87 template< unsigned int D >
88 std::string cpPlugins::Plugins::ImageReader::
89 _GD0( itk::ImageIOBase* io, const TStringList& names )
91 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
92 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
95 if( pt == itk::ImageIOBase::SCALAR )
99 case itk::ImageIOBase::UCHAR:
100 r = this->_RealGD< unsigned char, D >( names );
102 case itk::ImageIOBase::CHAR:
103 r = this->_RealGD< char, D >( names );
105 case itk::ImageIOBase::USHORT:
106 r = this->_RealGD< unsigned short, D >( names );
108 case itk::ImageIOBase::SHORT:
109 r = this->_RealGD< short, D >( names );
111 case itk::ImageIOBase::UINT:
112 r = this->_RealGD< unsigned int, D >( names );
114 case itk::ImageIOBase::INT:
115 r = this->_RealGD< int, D >( names );
117 case itk::ImageIOBase::ULONG:
118 r = this->_RealGD< unsigned long, D >( names );
120 case itk::ImageIOBase::LONG:
121 r = this->_RealGD< long, D >( names );
123 case itk::ImageIOBase::FLOAT:
124 r = this->_RealGD< float, D >( names );
126 case itk::ImageIOBase::DOUBLE:
127 r = this->_RealGD< double, D >( names );
130 r = "ImageReader: Scalar pixel type not supported.";
134 else if( pt == itk::ImageIOBase::RGB )
140 case itk::ImageIOBase::UCHAR:
141 r = this->_RealGD< itk::RGBPixel< unsigned char >, 2 >( names );
143 case itk::ImageIOBase::CHAR:
144 r = this->_RealGD< itk::RGBPixel< char >, 2 >( names );
146 case itk::ImageIOBase::USHORT:
147 r = this->_RealGD< itk::RGBPixel< unsigned short >, 2 >( names );
149 case itk::ImageIOBase::SHORT:
150 r = this->_RealGD< itk::RGBPixel< short >, 2 >( names );
153 r = "ImageReader: Scalar pixel type not supported.";
161 case itk::ImageIOBase::UCHAR:
162 r = this->_RealGD< itk::RGBPixel< unsigned char >, 3 >( names );
164 case itk::ImageIOBase::CHAR:
165 r = this->_RealGD< itk::RGBPixel< char >, 3 >( names );
167 case itk::ImageIOBase::USHORT:
168 r = this->_RealGD< itk::RGBPixel< unsigned short >, 3 >( names );
170 case itk::ImageIOBase::SHORT:
171 r = this->_RealGD< itk::RGBPixel< short >, 3 >( names );
174 r = "ImageReader: Scalar pixel type not supported.";
182 case itk::ImageIOBase::UCHAR:
183 r = this->_RealGD< itk::RGBPixel< unsigned char >, 4 >( names );
185 case itk::ImageIOBase::CHAR:
186 r = this->_RealGD< itk::RGBPixel< char >, 4 >( names );
188 case itk::ImageIOBase::USHORT:
189 r = this->_RealGD< itk::RGBPixel< unsigned short >, 4 >( names );
191 case itk::ImageIOBase::SHORT:
192 r = this->_RealGD< itk::RGBPixel< short >, 4 >( names );
195 r = "ImageReader: Scalar pixel type not supported.";
201 else if( pt == itk::ImageIOBase::RGBA )
207 case itk::ImageIOBase::UCHAR:
208 r = this->_RealGD< itk::RGBAPixel< unsigned char >, 2 >( names );
210 case itk::ImageIOBase::CHAR:
211 r = this->_RealGD< itk::RGBAPixel< char >, 2 >( names );
213 case itk::ImageIOBase::USHORT:
214 r = this->_RealGD< itk::RGBAPixel< unsigned short >, 2 >( names );
216 case itk::ImageIOBase::SHORT:
217 r = this->_RealGD< itk::RGBAPixel< short >, 2 >( names );
220 r = "ImageReader: Scalar pixel type not supported.";
228 case itk::ImageIOBase::UCHAR:
229 r = this->_RealGD< itk::RGBAPixel< unsigned char >, 3 >( names );
231 case itk::ImageIOBase::CHAR:
232 r = this->_RealGD< itk::RGBAPixel< char >, 3 >( names );
234 case itk::ImageIOBase::USHORT:
235 r = this->_RealGD< itk::RGBAPixel< unsigned short >, 3 >( names );
237 case itk::ImageIOBase::SHORT:
238 r = this->_RealGD< itk::RGBAPixel< short >, 3 >( names );
241 r = "ImageReader: Scalar pixel type not supported.";
249 case itk::ImageIOBase::UCHAR:
250 r = this->_RealGD< itk::RGBAPixel< unsigned char >, 4 >( names );
252 case itk::ImageIOBase::CHAR:
253 r = this->_RealGD< itk::RGBAPixel< char >, 4 >( names );
255 case itk::ImageIOBase::USHORT:
256 r = this->_RealGD< itk::RGBAPixel< unsigned short >, 4 >( names );
258 case itk::ImageIOBase::SHORT:
259 r = this->_RealGD< itk::RGBAPixel< short >, 4 >( names );
262 r = "ImageReader: Scalar pixel type not supported.";
268 else if( pt == itk::ImageIOBase::OFFSET )
273 r = this->_RealGD< itk::Offset< 2 >, 2 >( names );
276 r = this->_RealGD< itk::Offset< 3 >, 3 >( names );
279 r = this->_RealGD< itk::Offset< 4 >, 4 >( names );
282 r = "ImageReader: Offset pixel dimension not supported.";
286 else if( pt == itk::ImageIOBase::VECTOR )
290 case itk::ImageIOBase::FLOAT:
291 r = this->_RealGD< itk::Vector< float, D >, D >( names );
293 case itk::ImageIOBase::DOUBLE:
294 r = this->_RealGD< itk::Vector< double, D >, D >( names );
297 r = "ImageReader: Vector type not supported.";
301 else if( pt == itk::ImageIOBase::POINT )
305 case itk::ImageIOBase::FLOAT:
306 r = this->_RealGD< itk::Point< float, D >, D >( names );
308 case itk::ImageIOBase::DOUBLE:
309 r = this->_RealGD< itk::Point< double, D >, D >( names );
312 r = "ImageReader: Point type not supported.";
316 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
320 case itk::ImageIOBase::FLOAT:
321 r = this->_RealGD< itk::CovariantVector< float, D >, D >( names );
323 case itk::ImageIOBase::DOUBLE:
324 r = this->_RealGD< itk::CovariantVector< double, D >, D >( names );
327 r = "ImageReader: Vector type not supported.";
331 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
335 case itk::ImageIOBase::FLOAT:
337 this->_RealGD< itk::SymmetricSecondRankTensor< float, D >, D >(
341 case itk::ImageIOBase::DOUBLE:
343 this->_RealGD< itk::SymmetricSecondRankTensor< double, D >, D >(
348 r = "ImageReader: Vector type not supported.";
352 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
358 case itk::ImageIOBase::FLOAT:
359 r = this->_RealGD< itk::DiffusionTensor3D< float >, 3 >( names );
361 case itk::ImageIOBase::DOUBLE:
362 r = this->_RealGD< itk::DiffusionTensor3D< double >, 3 >( names );
365 r = "ImageReader: Diffusion tensor type not supported.";
370 r = "ImageReader: Diffusion tensor dimension not supported.";
372 else if( pt == itk::ImageIOBase::COMPLEX )
376 case itk::ImageIOBase::FLOAT:
377 r = this->_RealGD< std::complex< float >, D >( names );
379 case itk::ImageIOBase::DOUBLE:
380 r = this->_RealGD< std::complex< double >, D >( names );
383 r = "ImageReader: Complex type not supported.";
388 r = "ImageReader: Image pixel type not yet supported.";
390 itk::ImageIOBase::FIXEDARRAY
391 itk::ImageIOBase::MATRIX
397 // -------------------------------------------------------------------------
398 template< class P, unsigned int D >
399 std::string cpPlugins::Plugins::ImageReader::
400 _RealGD( const TStringList& names )
402 typedef itk::Image< P, D > _I;
405 if( names.size( ) == 1 )
408 typedef itk::ImageFileReader< _I > _SR;
410 dynamic_cast< _SR* >( this->m_RealProcessObject.GetPointer( ) );
413 this->m_RealProcessObject = _SR::New( );
415 dynamic_cast< _SR* >( this->m_RealProcessObject.GetPointer( ) );
418 reader->SetFileName( names[ 0 ] );
422 cpPlugins::Interface::Image* out =
423 this->_Output< cpPlugins::Interface::Image >( 0 );
425 out->SetITKImage< _I >( reader->GetOutput( ) );
427 r = "ImageReader: output not correctly created.";
429 catch( itk::ExceptionObject& err )
431 r = "ImageReader: " + std::string( err.GetDescription( ) );
432 cpPlugins::Interface::Image* out =
433 this->_Output< cpPlugins::Interface::Image >( 0 );
435 out->SetITKImage< _I >( NULL );
437 r = "ImageReader: output not correctly created.";
441 else if( names.size( ) > 1 )
444 std::set< std::string > ordered_names;
445 for( unsigned int i = 0; i < names.size( ); ++i )
446 ordered_names.insert( names[ i ] );
448 typedef itk::ImageSeriesReader< _I > _MR;
450 dynamic_cast< _MR* >( this->m_RealProcessObject.GetPointer( ) );
453 this->m_RealProcessObject = _MR::New( );
455 dynamic_cast< _MR* >( this->m_RealProcessObject.GetPointer( ) );
458 std::set< std::string >::const_iterator fnIt = ordered_names.begin( );
459 for( ; fnIt != ordered_names.end( ); ++fnIt )
460 reader->AddFileName( *fnIt );
464 cpPlugins::Interface::Image* out =
465 this->_Output< cpPlugins::Interface::Image >( 0 );
467 out->SetITKImage< _I >( reader->GetOutput( ) );
469 r = "ImageReader: output not correctly created.";
471 catch( itk::ExceptionObject& err )
473 r = "ImageReader: " + std::string( err.GetDescription( ) );
474 cpPlugins::Interface::Image* out =
475 this->_Output< cpPlugins::Interface::Image >( 0 );
477 out->SetITKImage< _I >( NULL );
479 r = "ImageReader: output not correctly created.";
484 r = "ImageReader: No image files given";