#include "ImageReader.h" #include #include #include #include // ------------------------------------------------------------------------- cpPlugins::IO::ImageReader:: ImageReader( ) : Superclass( ) { this->m_ClassName = "cpPlugins::IO::ImageReader"; this->m_ClassCategory = "ImageReader"; this->SetNumberOfOutputs( 1 ); this->_MakeOutput< cpPlugins::Interface::Image >( 0 ); using namespace cpPlugins::Interface; this->m_DefaultParameters.Configure( Parameters::StringList, "FileNames" ); this->m_DefaultParameters.Configure( Parameters::Bool, "VectorType" ); this->m_DefaultParameters.SetValueAsBool( "VectorType", false ); this->m_Parameters = this->m_DefaultParameters; } // ------------------------------------------------------------------------- cpPlugins::IO::ImageReader:: ~ImageReader( ) { } // ------------------------------------------------------------------------- std::string cpPlugins::IO::ImageReader:: _GenerateData( ) { // Get filenames TStringList names; this->m_Parameters.GetValueAsStringList( names, "FileNames" ); std::string r = ""; if( names.size( ) >= 1 ) { // Guess image properties itk::ImageIOBase::Pointer io = itk::ImageIOFactory::CreateImageIO( names[ 0 ].c_str( ), itk::ImageIOFactory::ReadMode ); if( io.IsNotNull( ) ) { io->SetFileName( names[ 0 ] ); io->ReadImageInformation( ); if( names.size( ) >= 1 ) { switch( io->GetNumberOfDimensions( ) ) { case 2: r = this->_GD0< 2 >( io, names ); break; case 3: r = this->_GD0< 3 >( io, names ); break; case 4: r = this->_GD0< 4 >( io, names ); break; default: r = "ImageReader: Image dimension not supported."; break; } // hctiws } // fi } else r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\""; } else r = "No image files given"; return( r ); } // ------------------------------------------------------------------------- template< unsigned int D > std::string cpPlugins::IO::ImageReader:: _GD0( itk::ImageIOBase* io, const TStringList& names ) { itk::ImageIOBase::IOComponentType ct = io->GetComponentType( ); itk::ImageIOBase::IOPixelType pt = io->GetPixelType( ); std::string r = ""; if( pt == itk::ImageIOBase::SCALAR ) { switch( ct ) { case itk::ImageIOBase::UCHAR: r = this->_GD1< unsigned char, D >( names ); break; case itk::ImageIOBase::CHAR: r = this->_GD1< char, D >( names ); break; case itk::ImageIOBase::USHORT: r = this->_GD1< unsigned short, D >( names ); break; case itk::ImageIOBase::SHORT: r = this->_GD1< short, D >( names ); break; case itk::ImageIOBase::UINT: r = this->_GD1< unsigned int, D >( names ); break; case itk::ImageIOBase::INT: r = this->_GD1< int, D >( names ); break; case itk::ImageIOBase::ULONG: r = this->_GD1< unsigned long, D >( names ); break; case itk::ImageIOBase::LONG: r = this->_GD1< long, D >( names ); break; case itk::ImageIOBase::FLOAT: r = this->_GD1< float, D >( names ); break; case itk::ImageIOBase::DOUBLE: r = this->_GD1< double, D >( names ); break; default: r = "ImageReader: Scalar pixel type not supported."; break; } // hctiws } else if( pt == itk::ImageIOBase::RGB ) { switch( ct ) { case itk::ImageIOBase::UCHAR: r = this->_GD1< itk::RGBPixel< unsigned char >, D >( names ); break; case itk::ImageIOBase::CHAR: r = this->_GD1< itk::RGBPixel< char >, D >( names ); break; case itk::ImageIOBase::USHORT: r = this->_GD1< itk::RGBPixel< unsigned short >, D >( names ); break; case itk::ImageIOBase::SHORT: r = this->_GD1< itk::RGBPixel< short >, D >( names ); break; case itk::ImageIOBase::UINT: r = this->_GD1< itk::RGBPixel< unsigned int >, D >( names ); break; case itk::ImageIOBase::INT: r = this->_GD1< itk::RGBPixel< int >, D >( names ); break; case itk::ImageIOBase::ULONG: r = this->_GD1< itk::RGBPixel< unsigned long >, D >( names ); break; case itk::ImageIOBase::LONG: r = this->_GD1< itk::RGBPixel< long >, D >( names ); break; case itk::ImageIOBase::FLOAT: r = this->_GD1< itk::RGBPixel< float >, D >( names ); break; case itk::ImageIOBase::DOUBLE: r = this->_GD1< itk::RGBPixel< double >, D >( names ); break; default: r = "ImageReader: RGB pixel type not supported."; break; } // hctiws } else if( pt == itk::ImageIOBase::RGBA ) { switch( ct ) { case itk::ImageIOBase::UCHAR: r = this->_GD1< itk::RGBAPixel< unsigned char >, D >( names ); break; case itk::ImageIOBase::CHAR: r = this->_GD1< itk::RGBAPixel< char >, D >( names ); break; case itk::ImageIOBase::USHORT: r = this->_GD1< itk::RGBAPixel< unsigned short >, D >( names ); break; case itk::ImageIOBase::SHORT: r = this->_GD1< itk::RGBAPixel< short >, D >( names ); break; case itk::ImageIOBase::UINT: r = this->_GD1< itk::RGBAPixel< unsigned int >, D >( names ); break; case itk::ImageIOBase::INT: r = this->_GD1< itk::RGBAPixel< int >, D >( names ); break; case itk::ImageIOBase::ULONG: r = this->_GD1< itk::RGBAPixel< unsigned long >, D >( names ); break; case itk::ImageIOBase::LONG: r = this->_GD1< itk::RGBAPixel< long >, D >( names ); break; case itk::ImageIOBase::FLOAT: r = this->_GD1< itk::RGBAPixel< float >, D >( names ); break; case itk::ImageIOBase::DOUBLE: r = this->_GD1< itk::RGBAPixel< double >, D >( names ); break; default: r = "ImageReader: RGBA pixel type not supported."; break; } // hctiws } else if( pt == itk::ImageIOBase::VECTOR ) { switch( ct ) { case itk::ImageIOBase::FLOAT: r = this->_GD1< itk::Vector< float, D >, D >( names ); break; case itk::ImageIOBase::DOUBLE: r = this->_GD1< 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->_GD1< itk::Point< float, D >, D >( names ); break; case itk::ImageIOBase::DOUBLE: r = this->_GD1< 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->_GD1< itk::CovariantVector< float, D >, D >( names ); break; case itk::ImageIOBase::DOUBLE: r = this->_GD1< 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->_GD1< itk::SymmetricSecondRankTensor< float, D >, D >( names ); break; case itk::ImageIOBase::DOUBLE: r = this->_GD1< itk::SymmetricSecondRankTensor< double, D >, D >( names ); break; default: r = "ImageReader: Vector type not supported."; break; } // hctiws } else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D ) { switch( ct ) { case itk::ImageIOBase::FLOAT: r = this->_GD1< itk::DiffusionTensor3D< float >, D >( names ); break; case itk::ImageIOBase::DOUBLE: r = this->_GD1< itk::DiffusionTensor3D< double >, D >( names ); break; default: r = "ImageReader: Diffusion tensor type not supported."; break; } // hctiws } else if( pt == itk::ImageIOBase::COMPLEX ) { switch( ct ) { case itk::ImageIOBase::FLOAT: r = this->_GD1< std::complex< float >, D >( names ); break; case itk::ImageIOBase::DOUBLE: r = this->_GD1< std::complex< double >, D >( names ); break; default: r = "ImageReader: Complex type not supported."; break; } // hctiws } else if( pt == itk::ImageIOBase::OFFSET ) r = this->_GD1< itk::Offset< D >, D >( names ); 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::IO::ImageReader:: _GD1( const TStringList& names ) { if( this->m_Parameters.GetValueAsBool( "VectorType" ) ) return( this->_RealGD< itk::VectorImage< P, D > >( names ) ); else return( this->_RealGD< itk::Image< P, D > >( names ) ); } // ------------------------------------------------------------------------- template< class I > std::string cpPlugins::IO::ImageReader:: _RealGD( const TStringList& names ) { 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 ) { // Read single image typedef itk::ImageFileReader< I > _SR; _SR* reader = dynamic_cast< _SR* >( this->m_RealProcessObject.GetPointer( ) ); if( reader == NULL ) { this->m_RealProcessObject = _SR::New( ); reader = dynamic_cast< _SR* >( this->m_RealProcessObject.GetPointer( ) ); } // fi reader->SetFileName( names[ 0 ] ); try { reader->Update( ); out->SetITKImage< I >( reader->GetOutput( ) ); } catch( itk::ExceptionObject& err ) { r = "ImageReader: " + std::string( err.GetDescription( ) ); out->SetITKImage< I >( NULL ); } // yrt } else if( names.size( ) > 1 ) { // Read image series std::set< std::string > ordered_names; for( unsigned int i = 0; i < names.size( ); ++i ) ordered_names.insert( names[ i ] ); typedef itk::ImageSeriesReader< I > _MR; _MR* reader = dynamic_cast< _MR* >( this->m_RealProcessObject.GetPointer( ) ); if( reader == NULL ) { this->m_RealProcessObject = _MR::New( ); reader = dynamic_cast< _MR* >( this->m_RealProcessObject.GetPointer( ) ); } // fi std::set< std::string >::const_iterator fnIt = ordered_names.begin( ); for( ; fnIt != ordered_names.end( ); ++fnIt ) { reader->AddFileName( *fnIt ); } try { reader->Update( ); out->SetITKImage< I >( reader->GetOutput( ) ); } catch( itk::ExceptionObject& err ) { r = "ImageReader: " + std::string( err.GetDescription( ) ); out->SetITKImage< I >( NULL ); } // yrt } else r = "ImageReader: No image files given"; return( r ); } // eof - $RCSfile$