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 1: r = this->_GD0< 1 >( io, names ); break;
70 case 2: r = this->_GD0< 2 >( io, names ); break;
71 case 3: r = this->_GD0< 3 >( io, names ); break;
72 case 4: r = this->_GD0< 4 >( io, names ); break;
74 r = "ImageReader: Single image dimension not supported.";
78 else if( names.size( ) > 1 )
80 switch( io->GetNumberOfDimensions( ) )
82 case 1: r = this->_GD0< 2 >( io, names ); break;
83 case 2: r = this->_GD0< 3 >( io, names ); break;
84 case 3: r = this->_GD0< 4 >( io, names ); break;
86 r = "ImageReader: Multiple images dimension not supported.";
93 r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\"";
96 r = "No image files given";
100 // -------------------------------------------------------------------------
101 template< unsigned int D >
102 std::string cpPlugins::Plugins::ImageReader::
103 _GD0( itk::ImageIOBase* io, const TStringList& names )
105 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
106 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
109 if( pt == itk::ImageIOBase::SCALAR )
113 case itk::ImageIOBase::UCHAR:
114 r = this->_RealGD< unsigned char, D >( names );
116 case itk::ImageIOBase::CHAR:
117 r = this->_RealGD< char, D >( names );
119 case itk::ImageIOBase::USHORT:
120 r = this->_RealGD< unsigned short, D >( names );
122 case itk::ImageIOBase::SHORT:
123 r = this->_RealGD< short, D >( names );
125 case itk::ImageIOBase::UINT:
126 r = this->_RealGD< unsigned int, D >( names );
128 case itk::ImageIOBase::INT:
129 r = this->_RealGD< int, D >( names );
131 case itk::ImageIOBase::ULONG:
132 r = this->_RealGD< unsigned long, D >( names );
134 case itk::ImageIOBase::LONG:
135 r = this->_RealGD< long, D >( names );
137 case itk::ImageIOBase::FLOAT:
138 r = this->_RealGD< float, D >( names );
140 case itk::ImageIOBase::DOUBLE:
141 r = this->_RealGD< double, D >( names );
144 r = "ImageReader: Scalar pixel type not supported.";
148 else if( pt == itk::ImageIOBase::RGB )
154 case itk::ImageIOBase::UCHAR:
155 r = this->_RealGD< itk::RGBPixel< unsigned char >, 2 >( names );
157 case itk::ImageIOBase::CHAR:
158 r = this->_RealGD< itk::RGBPixel< char >, 2 >( names );
160 case itk::ImageIOBase::USHORT:
161 r = this->_RealGD< itk::RGBPixel< unsigned short >, 2 >( names );
163 case itk::ImageIOBase::SHORT:
164 r = this->_RealGD< itk::RGBPixel< short >, 2 >( names );
167 r = "ImageReader: Scalar pixel type not supported.";
175 case itk::ImageIOBase::UCHAR:
176 r = this->_RealGD< itk::RGBPixel< unsigned char >, 3 >( names );
178 case itk::ImageIOBase::CHAR:
179 r = this->_RealGD< itk::RGBPixel< char >, 3 >( names );
181 case itk::ImageIOBase::USHORT:
182 r = this->_RealGD< itk::RGBPixel< unsigned short >, 3 >( names );
184 case itk::ImageIOBase::SHORT:
185 r = this->_RealGD< itk::RGBPixel< short >, 3 >( names );
188 r = "ImageReader: Scalar pixel type not supported.";
196 case itk::ImageIOBase::UCHAR:
197 r = this->_RealGD< itk::RGBPixel< unsigned char >, 4 >( names );
199 case itk::ImageIOBase::CHAR:
200 r = this->_RealGD< itk::RGBPixel< char >, 4 >( names );
202 case itk::ImageIOBase::USHORT:
203 r = this->_RealGD< itk::RGBPixel< unsigned short >, 4 >( names );
205 case itk::ImageIOBase::SHORT:
206 r = this->_RealGD< itk::RGBPixel< short >, 4 >( names );
209 r = "ImageReader: Scalar pixel type not supported.";
215 else if( pt == itk::ImageIOBase::RGBA )
221 case itk::ImageIOBase::UCHAR:
222 r = this->_RealGD< itk::RGBAPixel< unsigned char >, 2 >( names );
224 case itk::ImageIOBase::CHAR:
225 r = this->_RealGD< itk::RGBAPixel< char >, 2 >( names );
227 case itk::ImageIOBase::USHORT:
228 r = this->_RealGD< itk::RGBAPixel< unsigned short >, 2 >( names );
230 case itk::ImageIOBase::SHORT:
231 r = this->_RealGD< itk::RGBAPixel< short >, 2 >( names );
234 r = "ImageReader: Scalar pixel type not supported.";
242 case itk::ImageIOBase::UCHAR:
243 r = this->_RealGD< itk::RGBAPixel< unsigned char >, 3 >( names );
245 case itk::ImageIOBase::CHAR:
246 r = this->_RealGD< itk::RGBAPixel< char >, 3 >( names );
248 case itk::ImageIOBase::USHORT:
249 r = this->_RealGD< itk::RGBAPixel< unsigned short >, 3 >( names );
251 case itk::ImageIOBase::SHORT:
252 r = this->_RealGD< itk::RGBAPixel< short >, 3 >( names );
255 r = "ImageReader: Scalar pixel type not supported.";
263 case itk::ImageIOBase::UCHAR:
264 r = this->_RealGD< itk::RGBAPixel< unsigned char >, 4 >( names );
266 case itk::ImageIOBase::CHAR:
267 r = this->_RealGD< itk::RGBAPixel< char >, 4 >( names );
269 case itk::ImageIOBase::USHORT:
270 r = this->_RealGD< itk::RGBAPixel< unsigned short >, 4 >( names );
272 case itk::ImageIOBase::SHORT:
273 r = this->_RealGD< itk::RGBAPixel< short >, 4 >( names );
276 r = "ImageReader: Scalar pixel type not supported.";
282 else if( pt == itk::ImageIOBase::OFFSET )
287 r = this->_RealGD< itk::Offset< 1 >, 1 >( names );
290 r = this->_RealGD< itk::Offset< 2 >, 2 >( names );
293 r = this->_RealGD< itk::Offset< 3 >, 3 >( names );
296 r = this->_RealGD< itk::Offset< 4 >, 4 >( names );
299 r = "ImageReader: Offset pixel dimension not supported.";
303 else if( pt == itk::ImageIOBase::VECTOR )
307 case itk::ImageIOBase::FLOAT:
308 r = this->_RealGD< itk::Vector< float, D >, D >( names );
310 case itk::ImageIOBase::DOUBLE:
311 r = this->_RealGD< itk::Vector< double, D >, D >( names );
314 r = "ImageReader: Vector type not supported.";
318 else if( pt == itk::ImageIOBase::POINT )
322 case itk::ImageIOBase::FLOAT:
323 r = this->_RealGD< itk::Point< float, D >, D >( names );
325 case itk::ImageIOBase::DOUBLE:
326 r = this->_RealGD< itk::Point< double, D >, D >( names );
329 r = "ImageReader: Point type not supported.";
333 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
337 case itk::ImageIOBase::FLOAT:
338 r = this->_RealGD< itk::CovariantVector< float, D >, D >( names );
340 case itk::ImageIOBase::DOUBLE:
341 r = this->_RealGD< itk::CovariantVector< double, D >, D >( names );
344 r = "ImageReader: Vector type not supported.";
348 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
352 case itk::ImageIOBase::FLOAT:
354 this->_RealGD< itk::SymmetricSecondRankTensor< float, D >, D >(
358 case itk::ImageIOBase::DOUBLE:
360 this->_RealGD< itk::SymmetricSecondRankTensor< double, D >, D >(
365 r = "ImageReader: Vector type not supported.";
369 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
375 case itk::ImageIOBase::FLOAT:
376 r = this->_RealGD< itk::DiffusionTensor3D< float >, 3 >( names );
378 case itk::ImageIOBase::DOUBLE:
379 r = this->_RealGD< itk::DiffusionTensor3D< double >, 3 >( names );
382 r = "ImageReader: Diffusion tensor type not supported.";
387 r = "ImageReader: Diffusion tensor dimension not supported.";
389 else if( pt == itk::ImageIOBase::COMPLEX )
393 case itk::ImageIOBase::FLOAT:
394 r = this->_RealGD< std::complex< float >, D >( names );
396 case itk::ImageIOBase::DOUBLE:
397 r = this->_RealGD< std::complex< double >, D >( names );
400 r = "ImageReader: Complex type not supported.";
405 r = "ImageReader: Image pixel type not yet supported.";
407 itk::ImageIOBase::FIXEDARRAY
408 itk::ImageIOBase::MATRIX
414 // -------------------------------------------------------------------------
415 template< class P, unsigned int D >
416 std::string cpPlugins::Plugins::ImageReader::
417 _RealGD( const TStringList& names )
419 typedef itk::Image< P, D > _I;
422 if( names.size( ) == 1 )
425 typedef itk::ImageFileReader< _I > _SR;
427 dynamic_cast< _SR* >( this->m_RealProcessObject.GetPointer( ) );
430 this->m_RealProcessObject = _SR::New( );
432 dynamic_cast< _SR* >( this->m_RealProcessObject.GetPointer( ) );
435 reader->SetFileName( names[ 0 ] );
439 this->m_Outputs[ 0 ]->SetITKDataObject( reader->GetOutput( ) );
441 catch( itk::ExceptionObject& err )
443 r = "ImageReader: " + std::string( err.GetDescription( ) );
444 this->m_Outputs[ 0 ]->SetITKDataObject( NULL );
448 else if( names.size( ) > 1 )
451 std::set< std::string > ordered_names;
452 for( unsigned int i = 0; i < names.size( ); ++i )
453 ordered_names.insert( names[ i ] );
455 typedef itk::ImageSeriesReader< _I > _MR;
457 dynamic_cast< _MR* >( this->m_RealProcessObject.GetPointer( ) );
460 this->m_RealProcessObject = _MR::New( );
462 dynamic_cast< _MR* >( this->m_RealProcessObject.GetPointer( ) );
465 std::set< std::string >::const_iterator fnIt = ordered_names.begin( );
466 for( ; fnIt != ordered_names.end( ); ++fnIt )
467 reader->AddFileName( *fnIt );
471 this->m_Outputs[ 0 ]->SetITKDataObject( reader->GetOutput( ) );
473 catch( itk::ExceptionObject& err )
475 r = "ImageReader: " + std::string( err.GetDescription( ) );
476 this->m_Outputs[ 0 ]->SetITKDataObject( NULL );
481 r = "ImageReader: No image files given";