X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FcpPlugins%2FPlugins%2FImageReader.cxx;h=73611cb4a7130c7ac13d309d3afc6e4485f1df5d;hb=682f9e89a6ad9d24eadc51751a56fd3f146d649b;hp=2d1ae0493887d5cc8976be55a595eea88b118420;hpb=9015cf98c60cf4ab304a639990004ee783a8bec0;p=cpPlugins.git diff --git a/lib/cpPlugins/Plugins/ImageReader.cxx b/lib/cpPlugins/Plugins/ImageReader.cxx index 2d1ae04..73611cb 100644 --- a/lib/cpPlugins/Plugins/ImageReader.cxx +++ b/lib/cpPlugins/Plugins/ImageReader.cxx @@ -3,9 +3,6 @@ #include -#undef ITK_MANUAL_INSTANTIATION -#include -#include #include #include @@ -52,24 +49,13 @@ _GenerateData( ) { io->SetFileName( names[ 0 ] ); io->ReadImageInformation( ); - if( names.size( ) == 1 ) + if( names.size( ) >= 1 ) { switch( io->GetNumberOfDimensions( ) ) { - case 1: r = this->_GD0< 1 >( io, names ); break; case 2: r = this->_GD0< 2 >( io, names ); break; case 3: r = this->_GD0< 3 >( io, names ); break; - default: - r = "ImageReader: Image dimension not supported."; - break; - } // hctiws - } - else if( names.size( ) > 1 ) - { - switch( io->GetNumberOfDimensions( ) ) - { - case 1: r = this->_GD0< 2 >( io, names ); break; - case 2: r = this->_GD0< 3 >( io, names ); break; + case 4: r = this->_GD0< 4 >( io, names ); break; default: r = "ImageReader: Image dimension not supported."; break; @@ -90,108 +76,447 @@ template< unsigned int D > std::string cpPlugins::Plugins::ImageReader:: _GD0( itk::ImageIOBase* io, const TStringList& names ) { + itk::ImageIOBase::IOComponentType ct = io->GetComponentType( ); + itk::ImageIOBase::IOPixelType pt = io->GetPixelType( ); std::string r = ""; - switch( io->GetComponentType( ) ) + + if( pt == itk::ImageIOBase::SCALAR ) { - case itk::ImageIOBase::UCHAR: - r = this->_GD1< unsigned char, D >( io, names ); - break; - case itk::ImageIOBase::CHAR: - r = this->_GD1< char, D >( io, names ); - break; - case itk::ImageIOBase::USHORT: - r = this->_GD1< unsigned short, D >( io, names ); - break; - case itk::ImageIOBase::SHORT: - r = this->_GD1< short, D >( io, names ); - break; - case itk::ImageIOBase::UINT: - r = this->_GD1< unsigned int, D >( io, names ); - break; - case itk::ImageIOBase::INT: - r = this->_GD1< int, D >( io, names ); - break; - case itk::ImageIOBase::ULONG: - r = this->_GD1< unsigned long, D >( io, names ); - break; - case itk::ImageIOBase::LONG: - r = this->_GD1< long, D >( io, names ); - break; - case itk::ImageIOBase::FLOAT: - r = this->_GD1< float, D >( io, names ); - break; - case itk::ImageIOBase::DOUBLE: - r = this->_GD1< double, D >( io, names ); - break; - default: - r = "ImageReader: Atomic pixel type not supported."; - break; - } // hctiws - return( r ); -} + switch( ct ) + { + case itk::ImageIOBase::UCHAR: + r = this->_RealGD< unsigned char, D >( names ); + break; + case itk::ImageIOBase::CHAR: + r = this->_RealGD< char, D >( names ); + break; + case itk::ImageIOBase::USHORT: + r = this->_RealGD< unsigned short, D >( names ); + break; + case itk::ImageIOBase::SHORT: + r = this->_RealGD< short, D >( names ); + break; + case itk::ImageIOBase::UINT: + r = this->_RealGD< unsigned int, D >( names ); + break; + case itk::ImageIOBase::INT: + r = this->_RealGD< int, D >( names ); + break; + case itk::ImageIOBase::ULONG: + r = this->_RealGD< unsigned long, D >( names ); + break; + case itk::ImageIOBase::LONG: + r = this->_RealGD< long, D >( names ); + break; + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< float, D >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< double, D >( names ); + break; + default: + r = "ImageReader: Scalar pixel type not supported."; + break; + } // hctiws + } + else if( pt == itk::ImageIOBase::RGB ) + { + if( D == 2 ) + { + switch( ct ) + { + case itk::ImageIOBase::UCHAR: + r = this->_RealGD< itk::RGBPixel< unsigned char >, 2 >( names ); + break; + case itk::ImageIOBase::CHAR: + r = this->_RealGD< itk::RGBPixel< char >, 2 >( names ); + break; + case itk::ImageIOBase::USHORT: + r = this->_RealGD< itk::RGBPixel< unsigned short >, 2 >( names ); + break; + case itk::ImageIOBase::SHORT: + r = this->_RealGD< itk::RGBPixel< short >, 2 >( names ); + break; + case itk::ImageIOBase::UINT: + r = this->_RealGD< itk::RGBPixel< unsigned int >, 2 >( names ); + break; + case itk::ImageIOBase::INT: + r = this->_RealGD< itk::RGBPixel< int >, 2 >( names ); + break; + case itk::ImageIOBase::ULONG: + r = this->_RealGD< itk::RGBPixel< unsigned long >, 2 >( names ); + break; + case itk::ImageIOBase::LONG: + r = this->_RealGD< itk::RGBPixel< long >, 2 >( names ); + break; + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< itk::RGBPixel< float >, 2 >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< itk::RGBPixel< double >, 2 >( names ); + break; + default: + r = "ImageReader: RGB pixel type not supported."; + break; + } // hctiws + } + else if( D == 3 ) + { + switch( ct ) + { + case itk::ImageIOBase::UCHAR: + r = this->_RealGD< itk::RGBPixel< unsigned char >, 3 >( names ); + break; + case itk::ImageIOBase::CHAR: + r = this->_RealGD< itk::RGBPixel< char >, 3 >( names ); + break; + case itk::ImageIOBase::USHORT: + r = this->_RealGD< itk::RGBPixel< unsigned short >, 3 >( names ); + break; + case itk::ImageIOBase::SHORT: + r = this->_RealGD< itk::RGBPixel< short >, 3 >( names ); + break; + case itk::ImageIOBase::UINT: + r = this->_RealGD< itk::RGBPixel< unsigned int >, 3 >( names ); + break; + case itk::ImageIOBase::INT: + r = this->_RealGD< itk::RGBPixel< int >, 3 >( names ); + break; + case itk::ImageIOBase::ULONG: + r = this->_RealGD< itk::RGBPixel< unsigned long >, 3 >( names ); + break; + case itk::ImageIOBase::LONG: + r = this->_RealGD< itk::RGBPixel< long >, 3 >( names ); + break; + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< itk::RGBPixel< float >, 3 >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< itk::RGBPixel< double >, 3 >( names ); + break; + default: + r = "ImageReader: RGB pixel type not supported."; + break; + } // hctiws + } + else if( D == 4 ) + { + switch( ct ) + { + case itk::ImageIOBase::UCHAR: + r = this->_RealGD< itk::RGBPixel< unsigned char >, 4 >( names ); + break; + case itk::ImageIOBase::CHAR: + r = this->_RealGD< itk::RGBPixel< char >, 4 >( names ); + break; + case itk::ImageIOBase::USHORT: + r = this->_RealGD< itk::RGBPixel< unsigned short >, 4 >( names ); + break; + case itk::ImageIOBase::SHORT: + r = this->_RealGD< itk::RGBPixel< short >, 4 >( names ); + break; + case itk::ImageIOBase::UINT: + r = this->_RealGD< itk::RGBPixel< unsigned int >, 4 >( names ); + break; + case itk::ImageIOBase::INT: + r = this->_RealGD< itk::RGBPixel< int >, 4 >( names ); + break; + case itk::ImageIOBase::ULONG: + r = this->_RealGD< itk::RGBPixel< unsigned long >, 4 >( names ); + break; + case itk::ImageIOBase::LONG: + r = this->_RealGD< itk::RGBPixel< long >, 4 >( names ); + break; + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< itk::RGBPixel< float >, 4 >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< itk::RGBPixel< double >, 4 >( names ); + break; + default: + r = "ImageReader: RGB pixel type not supported."; + break; + } // hctiws -// ------------------------------------------------------------------------- -template< class P, unsigned int D > -std::string cpPlugins::Plugins::ImageReader:: -_GD1( itk::ImageIOBase* io, const TStringList& names ) -{ - std::string r = ""; - switch( io->GetPixelType( ) ) + } // fi + } + else if( pt == itk::ImageIOBase::RGBA ) { - case itk::ImageIOBase::SCALAR: - r = this->_GD2< P, D >( names ); - break; - case itk::ImageIOBase::RGB: - r = this->_GD2< itk::RGBPixel< P >, D >( names ); - break; - case itk::ImageIOBase::RGBA: - r = this->_GD2< itk::RGBAPixel< P >, D >( names ); - break; - /* TODO - case itk::ImageIOBase::OFFSET: - r = this->_GD2< itk::Offset< P >, D >( names ); - break; - case itk::ImageIOBase::VECTOR: - r = this->_GD2< P, D >( names ); - break; - case itk::ImageIOBase::POINT: - r = this->_GD2< P, D >( names ); - break; - case itk::ImageIOBase::COVARIANTVECTOR: - r = this->_GD2< P, D >( names ); - break; - case itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR: - r = this->_GD2< P, D >( names ); - break; - case itk::ImageIOBase::DIFFUSIONTENSOR3D: - r = this->_GD2< P, D >( names ); - break; - */ - /* TODO - case itk::ImageIOBase::COMPLEX: - r = this->_GD2< std::complex< P >, D >( names ); - break; - case itk::ImageIOBase::FIXEDARRAY: - r = this->_GD2< P, D >( names ); - break; - case itk::ImageIOBase::MATRIX: - r = this->_GD2< P, D >( names ); - break; - */ - default: - r = "ImageReader: Pixel type not supported."; - break; - } // hctiws + if( D == 2 ) + { + switch( ct ) + { + case itk::ImageIOBase::UCHAR: + r = this->_RealGD< itk::RGBAPixel< unsigned char >, 2 >( names ); + break; + case itk::ImageIOBase::CHAR: + r = this->_RealGD< itk::RGBAPixel< char >, 2 >( names ); + break; + case itk::ImageIOBase::USHORT: + r = this->_RealGD< itk::RGBAPixel< unsigned short >, 2 >( names ); + break; + case itk::ImageIOBase::SHORT: + r = this->_RealGD< itk::RGBAPixel< short >, 2 >( names ); + break; + case itk::ImageIOBase::UINT: + r = this->_RealGD< itk::RGBAPixel< unsigned int >, 2 >( names ); + break; + case itk::ImageIOBase::INT: + r = this->_RealGD< itk::RGBAPixel< int >, 2 >( names ); + break; + case itk::ImageIOBase::ULONG: + r = this->_RealGD< itk::RGBAPixel< unsigned long >, 2 >( names ); + break; + case itk::ImageIOBase::LONG: + r = this->_RealGD< itk::RGBAPixel< long >, 2 >( names ); + break; + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< itk::RGBAPixel< float >, 2 >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< itk::RGBAPixel< double >, 2 >( names ); + break; + default: + r = "ImageReader: RGBA pixel type not supported."; + break; + } // hctiws + } + else if( D == 3 ) + { + switch( ct ) + { + case itk::ImageIOBase::UCHAR: + r = this->_RealGD< itk::RGBAPixel< unsigned char >, 3 >( names ); + break; + case itk::ImageIOBase::CHAR: + r = this->_RealGD< itk::RGBAPixel< char >, 3 >( names ); + break; + case itk::ImageIOBase::USHORT: + r = this->_RealGD< itk::RGBAPixel< unsigned short >, 3 >( names ); + break; + case itk::ImageIOBase::SHORT: + r = this->_RealGD< itk::RGBAPixel< short >, 3 >( names ); + break; + case itk::ImageIOBase::UINT: + r = this->_RealGD< itk::RGBAPixel< unsigned int >, 3 >( names ); + break; + case itk::ImageIOBase::INT: + r = this->_RealGD< itk::RGBAPixel< int >, 3 >( names ); + break; + case itk::ImageIOBase::ULONG: + r = this->_RealGD< itk::RGBAPixel< unsigned long >, 3 >( names ); + break; + case itk::ImageIOBase::LONG: + r = this->_RealGD< itk::RGBAPixel< long >, 3 >( names ); + break; + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< itk::RGBAPixel< float >, 3 >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< itk::RGBAPixel< double >, 3 >( names ); + break; + default: + r = "ImageReader: RGBA pixel type not supported."; + break; + } // hctiws + } + else if( D == 4 ) + { + switch( ct ) + { + case itk::ImageIOBase::UCHAR: + r = this->_RealGD< itk::RGBAPixel< unsigned char >, 4 >( names ); + break; + case itk::ImageIOBase::CHAR: + r = this->_RealGD< itk::RGBAPixel< char >, 4 >( names ); + break; + case itk::ImageIOBase::USHORT: + r = this->_RealGD< itk::RGBAPixel< unsigned short >, 4 >( names ); + break; + case itk::ImageIOBase::SHORT: + r = this->_RealGD< itk::RGBAPixel< short >, 4 >( names ); + break; + case itk::ImageIOBase::UINT: + r = this->_RealGD< itk::RGBAPixel< unsigned int >, 4 >( names ); + break; + case itk::ImageIOBase::INT: + r = this->_RealGD< itk::RGBAPixel< int >, 4 >( names ); + break; + case itk::ImageIOBase::ULONG: + r = this->_RealGD< itk::RGBAPixel< unsigned long >, 4 >( names ); + break; + case itk::ImageIOBase::LONG: + r = this->_RealGD< itk::RGBAPixel< long >, 4 >( names ); + break; + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< itk::RGBAPixel< float >, 4 >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< itk::RGBAPixel< double >, 4 >( names ); + break; + default: + r = "ImageReader: RGBA pixel type not supported."; + break; + } // hctiws + + } // fi + } + else if( pt == itk::ImageIOBase::OFFSET ) + { + switch( D ) + { + case 2: + r = this->_RealGD< itk::Offset< 2 >, 2 >( names ); + break; + case 3: + r = this->_RealGD< itk::Offset< 3 >, 3 >( names ); + break; + case 4: + r = this->_RealGD< itk::Offset< 4 >, 4 >( names ); + break; + default: + r = "ImageReader: Offset pixel dimension not supported."; + break; + } // hctiws + } + else if( pt == itk::ImageIOBase::VECTOR ) + { + switch( ct ) + { + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< itk::Vector< float, D >, D >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< itk::Vector< double, D >, D >( names ); + break; + default: + r = "ImageReader: Vector type not supported."; + break; + } // hctiws + } + else if( pt == itk::ImageIOBase::POINT ) + { + switch( ct ) + { + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< itk::Point< float, D >, D >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< itk::Point< double, D >, D >( names ); + break; + default: + r = "ImageReader: Point type not supported."; + break; + } // hctiws + } + else if( pt == itk::ImageIOBase::COVARIANTVECTOR ) + { + switch( ct ) + { + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< itk::CovariantVector< float, D >, D >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< itk::CovariantVector< double, D >, D >( names ); + break; + default: + r = "ImageReader: CovariantVector type not supported."; + break; + } // hctiws + } + else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR ) + { + switch( ct ) + { + case itk::ImageIOBase::FLOAT: + r = + this->_RealGD< itk::SymmetricSecondRankTensor< float, D >, D >( + names + ); + break; + case itk::ImageIOBase::DOUBLE: + r = + this->_RealGD< itk::SymmetricSecondRankTensor< double, D >, D >( + names + ); + break; + default: + r = "ImageReader: Vector type not supported."; + break; + } // hctiws + } + else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D ) + { + if( D == 3 ) + { + switch( ct ) + { + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< itk::DiffusionTensor3D< float >, 3 >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< itk::DiffusionTensor3D< double >, 3 >( names ); + break; + default: + r = "ImageReader: Diffusion tensor type not supported."; + break; + } // hctiws + } + else if( D == 4 ) + { + switch( ct ) + { + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< itk::DiffusionTensor3D< float >, 4 >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< itk::DiffusionTensor3D< double >, 4 >( names ); + break; + default: + r = "ImageReader: Diffusion tensor type not supported."; + break; + } // hctiws + } + else + r = "ImageReader: Diffusion tensor dimension not supported."; + } + else if( pt == itk::ImageIOBase::COMPLEX ) + { + switch( ct ) + { + case itk::ImageIOBase::FLOAT: + r = this->_RealGD< std::complex< float >, D >( names ); + break; + case itk::ImageIOBase::DOUBLE: + r = this->_RealGD< std::complex< double >, D >( names ); + break; + default: + r = "ImageReader: Complex type not supported."; + break; + } // hctiws + } + else + r = "ImageReader: Image pixel type not yet supported."; + /* TODO + itk::ImageIOBase::FIXEDARRAY + itk::ImageIOBase::MATRIX + */ + return( r ); } // ------------------------------------------------------------------------- template< class P, unsigned int D > std::string cpPlugins::Plugins::ImageReader:: -_GD2( const TStringList& names ) +_RealGD( const TStringList& names ) { typedef itk::Image< P, D > _I; + cpPlugins::Interface::Image* out = + this->GetOutput< cpPlugins::Interface::Image >( 0 ); + if( out == NULL ) + return( "ImageReader: No output object properly created." ); + std::string r = ""; if( names.size( ) == 1 ) { @@ -210,12 +535,12 @@ _GD2( const TStringList& names ) try { reader->Update( ); - this->m_Outputs[ 0 ]->SetITKDataObject( reader->GetOutput( ) ); + out->SetITKImage< _I >( reader->GetOutput( ) ); } catch( itk::ExceptionObject& err ) { r = "ImageReader: " + std::string( err.GetDescription( ) ); - this->m_Outputs[ 0 ]->SetITKDataObject( NULL ); + out->SetITKImage< _I >( NULL ); } // yrt } @@ -238,16 +563,18 @@ _GD2( const TStringList& names ) } // fi std::set< std::string >::const_iterator fnIt = ordered_names.begin( ); for( ; fnIt != ordered_names.end( ); ++fnIt ) + { reader->AddFileName( *fnIt ); + } try { reader->Update( ); - this->m_Outputs[ 0 ]->SetITKDataObject( reader->GetOutput( ) ); + out->SetITKImage< _I >( reader->GetOutput( ) ); } catch( itk::ExceptionObject& err ) { r = "ImageReader: " + std::string( err.GetDescription( ) ); - this->m_Outputs[ 0 ]->SetITKDataObject( NULL ); + out->SetITKImage< _I >( NULL ); } // yrt }