#include "ImageReader.h" #include #include #include // ------------------------------------------------------------------------- cpPlugins::IO::ImageReader:: ImageReader( ) : Superclass( ) { this->_AddOutput< cpPlugins::Interface::Image >( "Output" ); this->m_Parameters->ConfigureAsOpenFileNameList( "FileNames" ); this->m_Parameters->ConfigureAsBool( "VectorType" ); this->m_Parameters->SetBool( "VectorType", false ); this->m_Parameters->SetAcceptedFileExtensions( "FileNames", "Image files (*.bmp *.png *.jpg *.jpeg *.dcm *.mhd *.nhdr *.nrrd *.tiff)" ); } // ------------------------------------------------------------------------- cpPlugins::IO::ImageReader:: ~ImageReader( ) { } // ------------------------------------------------------------------------- std::string cpPlugins::IO::ImageReader:: _GenerateData( ) { // Get filenames TStringList names = this->m_Parameters->GetOpenFileNameList( "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 = "ImageReader: 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->GetBool( "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 ) { auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" ); 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 = this->_CreateITK< _SR >( ); reader->SetFileName( names[ 0 ] ); try { reader->Update( ); out->SetITK< I >( reader->GetOutput( ) ); } catch( itk::ExceptionObject& err ) { r = "ImageReader: " + std::string( err.GetDescription( ) ); out->SetITK< I >( NULL ); } // yrt } else if( names.size( ) > 1 ) { // Read image series typedef itk::ImageSeriesReader< I > _MR; _MR* reader = this->_CreateITK< _MR >( ); for( unsigned int i = 0; i < names.size( ); ++i ) reader->AddFileName( names[ i ] ); try { reader->Update( ); out->SetITK< I >( reader->GetOutput( ) ); } catch( itk::ExceptionObject& err ) { r = "ImageReader: " + std::string( err.GetDescription( ) ); out->SetITK< I >( NULL ); } // yrt } else r = "ImageReader: No image files given"; return( r ); } // eof - $RCSfile$