#include #include #include #include #include #include #ifdef cpPlugins_QT4 #include #include // ------------------------------------------------------------------------- cpPluginsIO::ImageReaderQDialog:: ImageReaderQDialog( QWidget* parent ) : QFileDialog( parent ), m_ProcessObject( NULL ) { this->connect( this, SIGNAL( accepted( ) ), this, SLOT( _dlg_Accepted( ) ) ); this->setWindowTitle( "Open an(some) image(s)" ); } // ------------------------------------------------------------------------- cpPluginsIO::ImageReaderQDialog:: ~ImageReaderQDialog( ) { } // ------------------------------------------------------------------------- void cpPluginsIO::ImageReaderQDialog:: setProcessObject( cpPlugins::BaseObjects::ProcessObject* obj ) { if( obj == NULL ) return; this->m_ProcessObject = obj; auto param = this->m_ProcessObject->GetParameters( ); auto extensions = param->GetAcceptedFileExtensions( "FileNames" ); auto files = param->GetOpenFileNameList( "FileNames" ); QStringList filters; if( extensions != "" ) filters << extensions.c_str( ); filters << "Any file (*)"; this->setFileMode( QFileDialog::ExistingFiles ); this->setNameFilters( filters ); this->setAcceptMode( QFileDialog::AcceptOpen ); if( files.size( ) > 0 ) { QFileInfo info( files[ 0 ].c_str( ) ); this->setDirectory( info.canonicalPath( ) ); } // fi } // ------------------------------------------------------------------------- void cpPluginsIO::ImageReaderQDialog:: _dlg_Accepted( ) { if( this->m_ProcessObject != NULL ) { auto param = this->m_ProcessObject->GetParameters( ); auto files = this->selectedFiles( ); param->ClearOpenFileNameList( "FileNames" ); for( auto fIt = files.begin( ); fIt != files.end( ); ++fIt ) param->AddToOpenFileNameList( "FileNames", fIt->toStdString( ) ); } // fi } #endif // cpPlugins_QT4 // ------------------------------------------------------------------------- QDialog* cpPluginsIO::ImageReader:: CreateQDialog( ) { #ifdef cpPlugins_QT4 ImageReaderQDialog* dlg = NULL; if( QApplication::instance( ) != NULL ) { dlg = new ImageReaderQDialog( ); dlg->setProcessObject( this ); } // fi return( dlg ); #else // cpPlugins_QT4 return( NULL ); #endif // cpPlugins_QT4 } // ------------------------------------------------------------------------- cpPluginsIO::ImageReader:: ImageReader( ) : Superclass( ) { this->_ConfigureOutput< cpPlugins::DataObjects::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( ) { } // ------------------------------------------------------------------------- void cpPluginsIO::ImageReader:: _GenerateData( ) { // Get filenames auto fnames = this->m_Parameters.GetOpenFileNameList( "FileNames" ); 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 ) { bool success = false; unsigned int dim = io->GetNumberOfDimensions( ); #ifdef cpPlugins_CONFIG_PROCESS_DIMENSIONS_1 if( dim == 1 ) success = this->_GD0< 1 >( io ); #endif // cpPlugins_CONFIG_PROCESS_DIMENSIONS_1 #ifdef cpPlugins_CONFIG_PROCESS_DIMENSIONS_2 if( dim == 2 ) success = this->_GD0< 2 >( io ); #endif // cpPlugins_CONFIG_PROCESS_DIMENSIONS_2 #ifdef cpPlugins_CONFIG_PROCESS_DIMENSIONS_3 if( dim == 3 ) success = this->_GD0< 3 >( io ); #endif // cpPlugins_CONFIG_PROCESS_DIMENSIONS_3 #ifdef cpPlugins_CONFIG_PROCESS_DIMENSIONS_4 if( dim == 4 ) success = this->_GD0< 4 >( io ); #endif // cpPlugins_CONFIG_PROCESS_DIMENSIONS_4 if( !success ) this->_Error( "Image dimension not supported." ); } // fi } else this->_Error( std::string( "Could not create an ImageIO for \"" ) + fnames[ 0 ] + std::string( "\"" ) ); } else this->_Error( "No image(s) given" ); } // ------------------------------------------------------------------------- template< unsigned int _Dim > bool 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( ); bool success = false; if( pt == itk::ImageIOBase::SCALAR ) { #ifdef cpPlugins_CONFIG_INTEGER_TYPES_char if( ct == itk::ImageIOBase::CHAR ) success = this->_GD1< char, _Dim >( io ); if( ct == itk::ImageIOBase::UCHAR ) success = this->_GD1< uchar, _Dim >( io ); #endif // cpPlugins_CONFIG_INTEGER_TYPES_char #ifdef cpPlugins_CONFIG_INTEGER_TYPES_short if( ct == itk::ImageIOBase::SHORT ) success = this->_GD1< short, _Dim >( io ); if( ct == itk::ImageIOBase::USHORT ) success = this->_GD1< ushort, _Dim >( io ); #endif // cpPlugins_CONFIG_INTEGER_TYPES_short #ifdef cpPlugins_CONFIG_INTEGER_TYPES_int if( ct == itk::ImageIOBase::INT ) success = this->_GD1< int, _Dim >( io ); if( ct == itk::ImageIOBase::UINT ) success = this->_GD1< uint, _Dim >( io ); #endif // cpPlugins_CONFIG_INTEGER_TYPES_int #ifdef cpPlugins_CONFIG_INTEGER_TYPES_long if( ct == itk::ImageIOBase::LONG ) success = this->_GD1< long, _Dim >( io ); if( ct == itk::ImageIOBase::ULONG ) success = this->_GD1< ulong, _Dim >( io ); #endif // cpPlugins_CONFIG_INTEGER_TYPES_long #ifdef cpPlugins_CONFIG_INTEGER_TYPES_float if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< float, _Dim >( io ); #endif // cpPlugins_CONFIG_INTEGER_TYPES_float #ifdef cpPlugins_CONFIG_INTEGER_TYPES_double if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< double, _Dim >( io ); #endif // cpPlugins_CONFIG_INTEGER_TYPES_double } else if( pt == itk::ImageIOBase::RGB ) { #ifdef cpPlugins_CONFIG_COLOR_PIXELS_RGBPixel # ifdef cpPlugins_CONFIG_INTEGER_TYPES_char if( ct == itk::ImageIOBase::CHAR ) success = this->_GD1< itk::RGBPixel< char >, _Dim >( io ); if( ct == itk::ImageIOBase::UCHAR ) success = this->_GD1< itk::RGBPixel< uchar >, _Dim >( io ); # endif // cpPlugins_CONFIG_INTEGER_TYPES_char # ifdef cpPlugins_CONFIG_INTEGER_TYPES_short if( ct == itk::ImageIOBase::SHORT ) success = this->_GD1< itk::RGBPixel< short >, _Dim >( io ); if( ct == itk::ImageIOBase::USHORT ) success = this->_GD1< itk::RGBPixel< ushort >, _Dim >( io ); # endif // cpPlugins_CONFIG_INTEGER_TYPES_short # ifdef cpPlugins_CONFIG_INTEGER_TYPES_int if( ct == itk::ImageIOBase::INT ) success = this->_GD1< itk::RGBPixel< int >, _Dim >( io ); if( ct == itk::ImageIOBase::UINT ) success = this->_GD1< itk::RGBPixel< uint >, _Dim >( io ); # endif // cpPlugins_CONFIG_INTEGER_TYPES_int # ifdef cpPlugins_CONFIG_INTEGER_TYPES_long if( ct == itk::ImageIOBase::LONG ) success = this->_GD1< itk::RGBPixel< long >, _Dim >( io ); if( ct == itk::ImageIOBase::ULONG ) success = this->_GD1< itk::RGBPixel< ulong >, _Dim >( io ); # endif // cpPlugins_CONFIG_INTEGER_TYPES_long # ifdef cpPlugins_CONFIG_INTEGER_TYPES_float if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< itk::RGBPixel< float >, _Dim >( io ); # endif // cpPlugins_CONFIG_INTEGER_TYPES_float # ifdef cpPlugins_CONFIG_INTEGER_TYPES_double if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< itk::RGBPixel< double >, _Dim >( io ); # endif // cpPlugins_CONFIG_INTEGER_TYPES_double #endif // cpPlugins_CONFIG_COLOR_PIXELS_RGBPixel } else if( pt == itk::ImageIOBase::RGBA ) { #ifdef cpPlugins_CONFIG_COLOR_PIXELS_RGBAPixel # ifdef cpPlugins_CONFIG_INTEGER_TYPES_char if( ct == itk::ImageIOBase::CHAR ) success = this->_GD1< itk::RGBAPixel< char >, _Dim >( io ); if( ct == itk::ImageIOBase::UCHAR ) success = this->_GD1< itk::RGBAPixel< uchar >, _Dim >( io ); # endif // cpPlugins_CONFIG_INTEGER_TYPES_char # ifdef cpPlugins_CONFIG_INTEGER_TYPES_short if( ct == itk::ImageIOBase::SHORT ) success = this->_GD1< itk::RGBAPixel< short >, _Dim >( io ); if( ct == itk::ImageIOBase::USHORT ) success = this->_GD1< itk::RGBAPixel< ushort >, _Dim >( io ); # endif // cpPlugins_CONFIG_INTEGER_TYPES_short # ifdef cpPlugins_CONFIG_INTEGER_TYPES_int if( ct == itk::ImageIOBase::INT ) success = this->_GD1< itk::RGBAPixel< int >, _Dim >( io ); if( ct == itk::ImageIOBase::UINT ) success = this->_GD1< itk::RGBAPixel< uint >, _Dim >( io ); # endif // cpPlugins_CONFIG_INTEGER_TYPES_int # ifdef cpPlugins_CONFIG_INTEGER_TYPES_long if( ct == itk::ImageIOBase::LONG ) success = this->_GD1< itk::RGBAPixel< long >, _Dim >( io ); if( ct == itk::ImageIOBase::ULONG ) success = this->_GD1< itk::RGBAPixel< ulong >, _Dim >( io ); # endif // cpPlugins_CONFIG_INTEGER_TYPES_long # ifdef cpPlugins_CONFIG_INTEGER_TYPES_float if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< itk::RGBAPixel< float >, _Dim >( io ); # endif // cpPlugins_CONFIG_INTEGER_TYPES_float # ifdef cpPlugins_CONFIG_INTEGER_TYPES_double if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< itk::RGBAPixel< double >, _Dim >( io ); # endif // cpPlugins_CONFIG_INTEGER_TYPES_double #endif // cpPlugins_CONFIG_COLOR_PIXELS_RGBAPixel } else if( pt == itk::ImageIOBase::COMPLEX ) { } else if( pt == itk::ImageIOBase::COVARIANTVECTOR ) { } else if( pt == itk::ImageIOBase::POINT ) { } else if( pt == itk::ImageIOBase::VECTOR ) { } else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR ) { } else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D ) { if( _Dim == 3 ) { } else this->_Error( "DiffusionTensor3D dimension not supported." ); } else if( pt == itk::ImageIOBase::MATRIX ) { } else if( pt == itk::ImageIOBase::OFFSET ) { this->_GD1< itk::Offset< _Dim >, _Dim >( io ); } else if( pt == itk::ImageIOBase::FIXEDARRAY ) { } return( success ); } // ------------------------------------------------------------------------- template< class _TPixel, unsigned int _Dim > bool cpPluginsIO::ImageReader:: _GD1( itk::ImageIOBase* io ) { typedef itk::Image< _TPixel, _Dim > _TImage; // Get filenames 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( ) ); return( true ); } catch( itk::ExceptionObject& err ) { this->_Error( err.GetDescription( ) ); return( false ); } // yrt } 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( ) ); return( true ); } catch( itk::ExceptionObject& err ) { this->_Error( err.GetDescription( ) ); return( false ); } // yrt } // fi } // eof - $RCSfile$