#include #include #include #include #include #include #include // ------------------------------------------------------------------------- cpPluginsIO::ImageReader:: ImageReader( ) : Superclass( ) { this->_AddOutput< cpPlugins::Image >( "Output" ); this->m_Parameters.Clear( ); this->m_Parameters.ConfigureAsOpenFileNameList( "FileNames" ); this->m_Parameters.SetAcceptedFileExtensions( "FileNames", "Image files (*.bmp *.png *.jpg *.jpeg *.dcm *.mhd *.nhdr *.nrrd *.tiff)" ); } // ------------------------------------------------------------------------- cpPluginsIO::ImageReader:: ~ImageReader( ) { } // ------------------------------------------------------------------------- std::string cpPluginsIO::ImageReader:: _GenerateData( ) { // Get filenames auto fnames = this->m_Parameters.GetOpenFileNameList( "FileNames" ); std::string r = ""; if( fnames.size( ) >= 1 ) { // Guess image properties itk::ImageIOBase::Pointer io = itk::ImageIOFactory::CreateImageIO( fnames[ 0 ].c_str( ), itk::ImageIOFactory::ReadMode ); if( io.IsNotNull( ) ) { io->SetFileName( fnames[ 0 ] ); io->ReadImageInformation( ); if( fnames.size( ) >= 1 ) { switch( io->GetNumberOfDimensions( ) ) { case 1: r = this->_GD0< 1 >( io ); break; case 2: r = this->_GD0< 2 >( io ); break; case 3: r = this->_GD0< 3 >( io ); break; case 4: r = this->_GD0< 4 >( io ); break; default: r = "IO::ImageReader: Image dimension not supported."; break; } // hctiws } // fi } else r = "IO::ImageReader: Could not CreateImageIO for \"" + fnames[ 0 ] + "\""; } else r = "IO::ImageReader: No image(s) given"; return( r ); } // ------------------------------------------------------------------------- template< unsigned int _Dim > std::string cpPluginsIO::ImageReader:: _GD0( itk::ImageIOBase* io ) { typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; typedef unsigned long ulong; 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::CHAR : r = this->_GD1< char, _Dim >( io ); break; case itk::ImageIOBase::SHORT : r = this->_GD1< short, _Dim >( io ); break; case itk::ImageIOBase::INT : r = this->_GD1< int, _Dim >( io ); break; case itk::ImageIOBase::LONG : r = this->_GD1< long, _Dim >( io ); break; case itk::ImageIOBase::FLOAT : r = this->_GD1< float, _Dim >( io ); break; case itk::ImageIOBase::DOUBLE : r = this->_GD1< double, _Dim >( io ); break; case itk::ImageIOBase::UCHAR : r = this->_GD1< uchar, _Dim >( io ); break; case itk::ImageIOBase::USHORT : r = this->_GD1< ushort, _Dim >( io ); break; case itk::ImageIOBase::UINT : r = this->_GD1< uint, _Dim >( io ); break; case itk::ImageIOBase::ULONG : r = this->_GD1< ulong, _Dim >( io ); break; default: r = "IO::ImageReader: Scalar pixel type not supported."; break; } // hctiws } else if( pt == itk::ImageIOBase::RGB ) { switch( ct ) { case itk::ImageIOBase::CHAR : r = this->_GD1< itk::RGBPixel< char >, _Dim >( io ); break; case itk::ImageIOBase::SHORT : r = this->_GD1< itk::RGBPixel< short >, _Dim >( io ); break; case itk::ImageIOBase::INT : r = this->_GD1< itk::RGBPixel< int >, _Dim >( io ); break; case itk::ImageIOBase::LONG : r = this->_GD1< itk::RGBPixel< long >, _Dim >( io ); break; case itk::ImageIOBase::FLOAT : r = this->_GD1< itk::RGBPixel< float >, _Dim >( io ); break; case itk::ImageIOBase::DOUBLE : r = this->_GD1< itk::RGBPixel< double >, _Dim >( io ); break; case itk::ImageIOBase::UCHAR : r = this->_GD1< itk::RGBPixel< uchar >, _Dim >( io ); break; case itk::ImageIOBase::USHORT : r = this->_GD1< itk::RGBPixel< ushort >, _Dim >( io ); break; case itk::ImageIOBase::UINT : r = this->_GD1< itk::RGBPixel< uint >, _Dim >( io ); break; case itk::ImageIOBase::ULONG : r = this->_GD1< itk::RGBPixel< ulong >, _Dim >( io ); break; default: r = "IO::ImageReader: RGB pixel type not supported."; break; } // hctiws } else if( pt == itk::ImageIOBase::RGBA ) { switch( ct ) { case itk::ImageIOBase::CHAR : r = this->_GD1< itk::RGBAPixel< char >, _Dim >( io ); break; case itk::ImageIOBase::SHORT : r = this->_GD1< itk::RGBAPixel< short >, _Dim >( io ); break; case itk::ImageIOBase::INT : r = this->_GD1< itk::RGBAPixel< int >, _Dim >( io ); break; case itk::ImageIOBase::LONG : r = this->_GD1< itk::RGBAPixel< long >, _Dim >( io ); break; case itk::ImageIOBase::FLOAT : r = this->_GD1< itk::RGBAPixel< float >, _Dim >( io ); break; case itk::ImageIOBase::DOUBLE : r = this->_GD1< itk::RGBAPixel< double >, _Dim >( io ); break; case itk::ImageIOBase::UCHAR : r = this->_GD1< itk::RGBAPixel< uchar >, _Dim >( io ); break; case itk::ImageIOBase::USHORT : r = this->_GD1< itk::RGBAPixel< ushort >, _Dim >( io ); break; case itk::ImageIOBase::UINT : r = this->_GD1< itk::RGBAPixel< uint >, _Dim >( io ); break; case itk::ImageIOBase::ULONG : r = this->_GD1< itk::RGBAPixel< ulong >, _Dim >( io ); break; default: r = "IO::ImageReader: RGBA pixel type not supported."; break; } // hctiws } else if( pt == itk::ImageIOBase::COMPLEX ) { switch( ct ) { case itk::ImageIOBase::FLOAT : r = this->_GD1< std::complex< float >, _Dim >( io ); break; case itk::ImageIOBase::DOUBLE : r = this->_GD1< std::complex< double >, _Dim >( io ); break; default: r = "IO::ImageReader: complex pixel type not supported."; break; } // hctiws } /* TODO else if( pt == itk::ImageIOBase::VECTOR ) { } else if( pt == itk::ImageIOBase::POINT ) { } else if( pt == itk::ImageIOBase::COVARIANTVECTOR ) { } else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR ) { } else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D ) { } else if( pt == itk::ImageIOBase::OFFSET ) { } else if( pt == itk::ImageIOBase::FIXEDARRAY ) { } else if( pt == itk::ImageIOBase::MATRIX ) { } */ else r = "IO::ImageReader: Image pixel type not yet supported."; return( r ); } // ------------------------------------------------------------------------- template< class _TPixel, unsigned int _Dim > std::string cpPluginsIO::ImageReader:: _GD1( itk::ImageIOBase* io ) { typedef itk::Image< _TPixel, _Dim > _TImage; // Get filenames std::string r = ""; auto fnames = this->m_Parameters.GetOpenFileNameList( "FileNames" ); if( fnames.size( ) == 1 ) { auto f = this->_CreateITK< itk::ImageFileReader< _TImage > >( ); f->SetFileName( fnames[ 0 ] ); f->SetImageIO( io ); try { f->Update( ); this->GetOutput( "Output" )->SetITK( f->GetOutput( ) ); } catch( itk::ExceptionObject& err ) { r = "IO::ImageReader: " + std::string( err.GetDescription( ) ); } } else // if( fnames.size( ) > 1 ) { auto f = this->_CreateITK< itk::ImageSeriesReader< _TImage > >( ); for( auto i = fnames.begin( ); i != fnames.end( ); ++i ) f->AddFileName( *i ); f->SetImageIO( io ); try { f->Update( ); this->GetOutput( "Output" )->SetITK( f->GetOutput( ) ); } catch( itk::ExceptionObject& err ) { r = "IO::ImageReader: " + std::string( err.GetDescription( ) ); } } // fi return( r ); } // eof - $RCSfile$