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: Image dimension not supported.";
67 r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\"";
70 r = "No image files given";
74 // -------------------------------------------------------------------------
75 template< unsigned int D >
76 std::string cpPlugins::Plugins::ImageReader::
77 _GD0( itk::ImageIOBase* io, const TStringList& names )
79 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
80 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
83 if( pt == itk::ImageIOBase::SCALAR )
87 case itk::ImageIOBase::UCHAR:
88 r = this->_RealGD< unsigned char, D >( names );
90 case itk::ImageIOBase::CHAR:
91 r = this->_RealGD< char, D >( names );
93 case itk::ImageIOBase::USHORT:
94 r = this->_RealGD< unsigned short, D >( names );
96 case itk::ImageIOBase::SHORT:
97 r = this->_RealGD< short, D >( names );
99 case itk::ImageIOBase::UINT:
100 r = this->_RealGD< unsigned int, D >( names );
102 case itk::ImageIOBase::INT:
103 r = this->_RealGD< int, D >( names );
105 case itk::ImageIOBase::ULONG:
106 r = this->_RealGD< unsigned long, D >( names );
108 case itk::ImageIOBase::LONG:
109 r = this->_RealGD< long, D >( names );
111 case itk::ImageIOBase::FLOAT:
112 r = this->_RealGD< float, D >( names );
114 case itk::ImageIOBase::DOUBLE:
115 r = this->_RealGD< double, D >( names );
118 r = "ImageReader: Scalar pixel type not supported.";
122 else if( pt == itk::ImageIOBase::RGB )
128 case itk::ImageIOBase::UCHAR:
129 r = this->_RealGD< itk::RGBPixel< unsigned char >, 2 >( names );
131 case itk::ImageIOBase::CHAR:
132 r = this->_RealGD< itk::RGBPixel< char >, 2 >( names );
134 case itk::ImageIOBase::USHORT:
135 r = this->_RealGD< itk::RGBPixel< unsigned short >, 2 >( names );
137 case itk::ImageIOBase::SHORT:
138 r = this->_RealGD< itk::RGBPixel< short >, 2 >( names );
140 case itk::ImageIOBase::UINT:
141 r = this->_RealGD< itk::RGBPixel< unsigned int >, 2 >( names );
143 case itk::ImageIOBase::INT:
144 r = this->_RealGD< itk::RGBPixel< int >, 2 >( names );
146 case itk::ImageIOBase::ULONG:
147 r = this->_RealGD< itk::RGBPixel< unsigned long >, 2 >( names );
149 case itk::ImageIOBase::LONG:
150 r = this->_RealGD< itk::RGBPixel< long >, 2 >( names );
152 case itk::ImageIOBase::FLOAT:
153 r = this->_RealGD< itk::RGBPixel< float >, 2 >( names );
155 case itk::ImageIOBase::DOUBLE:
156 r = this->_RealGD< itk::RGBPixel< double >, 2 >( names );
159 r = "ImageReader: RGB pixel type not supported.";
167 case itk::ImageIOBase::UCHAR:
168 r = this->_RealGD< itk::RGBPixel< unsigned char >, 3 >( names );
170 case itk::ImageIOBase::CHAR:
171 r = this->_RealGD< itk::RGBPixel< char >, 3 >( names );
173 case itk::ImageIOBase::USHORT:
174 r = this->_RealGD< itk::RGBPixel< unsigned short >, 3 >( names );
176 case itk::ImageIOBase::SHORT:
177 r = this->_RealGD< itk::RGBPixel< short >, 3 >( names );
179 case itk::ImageIOBase::UINT:
180 r = this->_RealGD< itk::RGBPixel< unsigned int >, 3 >( names );
182 case itk::ImageIOBase::INT:
183 r = this->_RealGD< itk::RGBPixel< int >, 3 >( names );
185 case itk::ImageIOBase::ULONG:
186 r = this->_RealGD< itk::RGBPixel< unsigned long >, 3 >( names );
188 case itk::ImageIOBase::LONG:
189 r = this->_RealGD< itk::RGBPixel< long >, 3 >( names );
191 case itk::ImageIOBase::FLOAT:
192 r = this->_RealGD< itk::RGBPixel< float >, 3 >( names );
194 case itk::ImageIOBase::DOUBLE:
195 r = this->_RealGD< itk::RGBPixel< double >, 3 >( names );
198 r = "ImageReader: RGB pixel type not supported.";
206 case itk::ImageIOBase::UCHAR:
207 r = this->_RealGD< itk::RGBPixel< unsigned char >, 4 >( names );
209 case itk::ImageIOBase::CHAR:
210 r = this->_RealGD< itk::RGBPixel< char >, 4 >( names );
212 case itk::ImageIOBase::USHORT:
213 r = this->_RealGD< itk::RGBPixel< unsigned short >, 4 >( names );
215 case itk::ImageIOBase::SHORT:
216 r = this->_RealGD< itk::RGBPixel< short >, 4 >( names );
218 case itk::ImageIOBase::UINT:
219 r = this->_RealGD< itk::RGBPixel< unsigned int >, 4 >( names );
221 case itk::ImageIOBase::INT:
222 r = this->_RealGD< itk::RGBPixel< int >, 4 >( names );
224 case itk::ImageIOBase::ULONG:
225 r = this->_RealGD< itk::RGBPixel< unsigned long >, 4 >( names );
227 case itk::ImageIOBase::LONG:
228 r = this->_RealGD< itk::RGBPixel< long >, 4 >( names );
230 case itk::ImageIOBase::FLOAT:
231 r = this->_RealGD< itk::RGBPixel< float >, 4 >( names );
233 case itk::ImageIOBase::DOUBLE:
234 r = this->_RealGD< itk::RGBPixel< double >, 4 >( names );
237 r = "ImageReader: RGB pixel type not supported.";
243 else if( pt == itk::ImageIOBase::RGBA )
249 case itk::ImageIOBase::UCHAR:
250 r = this->_RealGD< itk::RGBAPixel< unsigned char >, 2 >( names );
252 case itk::ImageIOBase::CHAR:
253 r = this->_RealGD< itk::RGBAPixel< char >, 2 >( names );
255 case itk::ImageIOBase::USHORT:
256 r = this->_RealGD< itk::RGBAPixel< unsigned short >, 2 >( names );
258 case itk::ImageIOBase::SHORT:
259 r = this->_RealGD< itk::RGBAPixel< short >, 2 >( names );
261 case itk::ImageIOBase::UINT:
262 r = this->_RealGD< itk::RGBAPixel< unsigned int >, 2 >( names );
264 case itk::ImageIOBase::INT:
265 r = this->_RealGD< itk::RGBAPixel< int >, 2 >( names );
267 case itk::ImageIOBase::ULONG:
268 r = this->_RealGD< itk::RGBAPixel< unsigned long >, 2 >( names );
270 case itk::ImageIOBase::LONG:
271 r = this->_RealGD< itk::RGBAPixel< long >, 2 >( names );
273 case itk::ImageIOBase::FLOAT:
274 r = this->_RealGD< itk::RGBAPixel< float >, 2 >( names );
276 case itk::ImageIOBase::DOUBLE:
277 r = this->_RealGD< itk::RGBAPixel< double >, 2 >( names );
280 r = "ImageReader: RGBA pixel type not supported.";
288 case itk::ImageIOBase::UCHAR:
289 r = this->_RealGD< itk::RGBAPixel< unsigned char >, 3 >( names );
291 case itk::ImageIOBase::CHAR:
292 r = this->_RealGD< itk::RGBAPixel< char >, 3 >( names );
294 case itk::ImageIOBase::USHORT:
295 r = this->_RealGD< itk::RGBAPixel< unsigned short >, 3 >( names );
297 case itk::ImageIOBase::SHORT:
298 r = this->_RealGD< itk::RGBAPixel< short >, 3 >( names );
300 case itk::ImageIOBase::UINT:
301 r = this->_RealGD< itk::RGBAPixel< unsigned int >, 3 >( names );
303 case itk::ImageIOBase::INT:
304 r = this->_RealGD< itk::RGBAPixel< int >, 3 >( names );
306 case itk::ImageIOBase::ULONG:
307 r = this->_RealGD< itk::RGBAPixel< unsigned long >, 3 >( names );
309 case itk::ImageIOBase::LONG:
310 r = this->_RealGD< itk::RGBAPixel< long >, 3 >( names );
312 case itk::ImageIOBase::FLOAT:
313 r = this->_RealGD< itk::RGBAPixel< float >, 3 >( names );
315 case itk::ImageIOBase::DOUBLE:
316 r = this->_RealGD< itk::RGBAPixel< double >, 3 >( names );
319 r = "ImageReader: RGBA pixel type not supported.";
327 case itk::ImageIOBase::UCHAR:
328 r = this->_RealGD< itk::RGBAPixel< unsigned char >, 4 >( names );
330 case itk::ImageIOBase::CHAR:
331 r = this->_RealGD< itk::RGBAPixel< char >, 4 >( names );
333 case itk::ImageIOBase::USHORT:
334 r = this->_RealGD< itk::RGBAPixel< unsigned short >, 4 >( names );
336 case itk::ImageIOBase::SHORT:
337 r = this->_RealGD< itk::RGBAPixel< short >, 4 >( names );
339 case itk::ImageIOBase::UINT:
340 r = this->_RealGD< itk::RGBAPixel< unsigned int >, 4 >( names );
342 case itk::ImageIOBase::INT:
343 r = this->_RealGD< itk::RGBAPixel< int >, 4 >( names );
345 case itk::ImageIOBase::ULONG:
346 r = this->_RealGD< itk::RGBAPixel< unsigned long >, 4 >( names );
348 case itk::ImageIOBase::LONG:
349 r = this->_RealGD< itk::RGBAPixel< long >, 4 >( names );
351 case itk::ImageIOBase::FLOAT:
352 r = this->_RealGD< itk::RGBAPixel< float >, 4 >( names );
354 case itk::ImageIOBase::DOUBLE:
355 r = this->_RealGD< itk::RGBAPixel< double >, 4 >( names );
358 r = "ImageReader: RGBA pixel type not supported.";
364 else if( pt == itk::ImageIOBase::OFFSET )
369 r = this->_RealGD< itk::Offset< 2 >, 2 >( names );
372 r = this->_RealGD< itk::Offset< 3 >, 3 >( names );
375 r = this->_RealGD< itk::Offset< 4 >, 4 >( names );
378 r = "ImageReader: Offset pixel dimension not supported.";
382 else if( pt == itk::ImageIOBase::VECTOR )
386 case itk::ImageIOBase::FLOAT:
387 r = this->_RealGD< itk::Vector< float, D >, D >( names );
389 case itk::ImageIOBase::DOUBLE:
390 r = this->_RealGD< itk::Vector< double, D >, D >( names );
393 r = "ImageReader: Vector type not supported.";
397 else if( pt == itk::ImageIOBase::POINT )
401 case itk::ImageIOBase::FLOAT:
402 r = this->_RealGD< itk::Point< float, D >, D >( names );
404 case itk::ImageIOBase::DOUBLE:
405 r = this->_RealGD< itk::Point< double, D >, D >( names );
408 r = "ImageReader: Point type not supported.";
412 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
416 case itk::ImageIOBase::FLOAT:
417 r = this->_RealGD< itk::CovariantVector< float, D >, D >( names );
419 case itk::ImageIOBase::DOUBLE:
420 r = this->_RealGD< itk::CovariantVector< double, D >, D >( names );
423 r = "ImageReader: CovariantVector type not supported.";
427 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
431 case itk::ImageIOBase::FLOAT:
433 this->_RealGD< itk::SymmetricSecondRankTensor< float, D >, D >(
437 case itk::ImageIOBase::DOUBLE:
439 this->_RealGD< itk::SymmetricSecondRankTensor< double, D >, D >(
444 r = "ImageReader: Vector type not supported.";
448 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
454 case itk::ImageIOBase::FLOAT:
455 r = this->_RealGD< itk::DiffusionTensor3D< float >, 3 >( names );
457 case itk::ImageIOBase::DOUBLE:
458 r = this->_RealGD< itk::DiffusionTensor3D< double >, 3 >( names );
461 r = "ImageReader: Diffusion tensor type not supported.";
469 case itk::ImageIOBase::FLOAT:
470 r = this->_RealGD< itk::DiffusionTensor3D< float >, 4 >( names );
472 case itk::ImageIOBase::DOUBLE:
473 r = this->_RealGD< itk::DiffusionTensor3D< double >, 4 >( names );
476 r = "ImageReader: Diffusion tensor type not supported.";
481 r = "ImageReader: Diffusion tensor dimension not supported.";
483 else if( pt == itk::ImageIOBase::COMPLEX )
487 case itk::ImageIOBase::FLOAT:
488 r = this->_RealGD< std::complex< float >, D >( names );
490 case itk::ImageIOBase::DOUBLE:
491 r = this->_RealGD< std::complex< double >, D >( names );
494 r = "ImageReader: Complex type not supported.";
499 r = "ImageReader: Image pixel type not yet supported.";
501 itk::ImageIOBase::FIXEDARRAY
502 itk::ImageIOBase::MATRIX
508 // -------------------------------------------------------------------------
509 template< class P, unsigned int D >
510 std::string cpPlugins::Plugins::ImageReader::
511 _RealGD( const TStringList& names )
513 typedef itk::Image< P, D > _I;
515 cpPlugins::Interface::Image* out =
516 this->GetOutput< cpPlugins::Interface::Image >( 0 );
518 return( "ImageReader: No output object properly created." );
521 if( names.size( ) == 1 )
524 typedef itk::ImageFileReader< _I > _SR;
526 dynamic_cast< _SR* >( this->m_RealProcessObject.GetPointer( ) );
529 this->m_RealProcessObject = _SR::New( );
531 dynamic_cast< _SR* >( this->m_RealProcessObject.GetPointer( ) );
534 reader->SetFileName( names[ 0 ] );
538 out->SetITKImage< _I >( reader->GetOutput( ) );
540 catch( itk::ExceptionObject& err )
542 r = "ImageReader: " + std::string( err.GetDescription( ) );
543 out->SetITKImage< _I >( NULL );
547 else if( names.size( ) > 1 )
550 std::set< std::string > ordered_names;
551 for( unsigned int i = 0; i < names.size( ); ++i )
552 ordered_names.insert( names[ i ] );
554 typedef itk::ImageSeriesReader< _I > _MR;
556 dynamic_cast< _MR* >( this->m_RealProcessObject.GetPointer( ) );
559 this->m_RealProcessObject = _MR::New( );
561 dynamic_cast< _MR* >( this->m_RealProcessObject.GetPointer( ) );
564 std::set< std::string >::const_iterator fnIt = ordered_names.begin( );
565 for( ; fnIt != ordered_names.end( ); ++fnIt )
567 reader->AddFileName( *fnIt );
572 out->SetITKImage< _I >( reader->GetOutput( ) );
574 catch( itk::ExceptionObject& err )
576 r = "ImageReader: " + std::string( err.GetDescription( ) );
577 out->SetITKImage< _I >( NULL );
582 r = "ImageReader: No image files given";