]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Plugins/ImageReader.cxx
...
[cpPlugins.git] / lib / cpPlugins / Plugins / ImageReader.cxx
index 8838bf469f12a8f3f80bfefaaa4d4a1486f2c034..2d1ae0493887d5cc8976be55a595eea88b118420 100644 (file)
@@ -1,25 +1,28 @@
 #include <cpPlugins/Plugins/ImageReader.h>
 #include <cpPlugins/Interface/Image.h>
 
-#include <itkImageFileReader.h>
+#include <set>
 
-#define ITK_MANUAL_INSTANTIATION
+#undef ITK_MANUAL_INSTANTIATION
 #include <itkImage.h>
 #include <itkRGBPixel.h>
+#include <itkImageFileReader.h>
+#include <itkImageSeriesReader.h>
 
 // -------------------------------------------------------------------------
 cpPlugins::Plugins::ImageReader::
 ImageReader( )
   : Superclass( )
 {
+  this->m_ClassName = "cpPlugins::ImageReader";
+  this->m_ClassCategory = "ImageReader";
+
   this->SetNumberOfOutputs( 1 );
   this->_MakeOutput< cpPlugins::Interface::Image >( 0 );
 
-  this->m_DefaultParameters[ "FileName" ] =
-    TParameter( "string", "no_file_name" );
-  this->m_DefaultParameters[ "PixelType" ] = TParameter( "type", "uchar" );
-  this->m_DefaultParameters[ "ImageDimension" ] = TParameter( "int", "2" );
-  this->m_DefaultParameters[ "IsColorImage" ] = TParameter( "bool", "0" );
+  using namespace cpPlugins::Interface;
+  this->m_DefaultParameters.Configure( Parameters::StringList, "FileNames" );
+  this->m_Parameters = this->m_DefaultParameters;
 }
 
 // -------------------------------------------------------------------------
@@ -28,133 +31,229 @@ cpPlugins::Plugins::ImageReader::
 {
 }
 
-// -------------------------------------------------------------------------
-std::string cpPlugins::Plugins::ImageReader::
-GetClassName( ) const
-{
-  return( "cpPlugins::Plugins::ImageReader" );
-}
-
 // -------------------------------------------------------------------------
 std::string cpPlugins::Plugins::ImageReader::
 _GenerateData( )
 {
-  TParameters::const_iterator dIt;
-
-  // Get image dimension
-  dIt = this->m_Parameters.find( "ImageDimension" );
-  if( dIt == this->m_Parameters.end( ) )
-    dIt = this->m_DefaultParameters.find( "ImageDimension" );
+  // Get filenames
+  TStringList names;
+  this->m_Parameters.GetValueAsStringList( names, "FileNames" );
 
-  std::string r = "itk::Image dimension not supported.";
-  if     ( dIt->second.second == "1" ) r = this->_GD0< 1 >( );
-  else if( dIt->second.second == "2" ) r = this->_GD0< 2 >( );
-  else if( dIt->second.second == "3" ) r = this->_GD0< 3 >( );
-  else if( dIt->second.second == "4" ) r = this->_GD0< 4 >( );
+  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 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;
+        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::Plugins::ImageReader::
-_GD0( )
+_GD0( itk::ImageIOBase* io, const TStringList& names )
 {
-  TParameters::const_iterator tIt, cIt;
-
-  // Get image pixel type
-  tIt = this->m_Parameters.find( "PixelType" );
-  if( tIt == this->m_Parameters.end( ) )
-    tIt = this->m_DefaultParameters.find( "PixelType" );
-  cIt = this->m_Parameters.find( "IsColorImage" );
-  if( cIt == this->m_Parameters.end( ) )
-    cIt = this->m_DefaultParameters.find( "IsColorImage" );
-
-  std::string r = "itk::Image pixel type not supported";
-  if( cIt->second.second == "0" )
+  std::string r = "";
+  switch( io->GetComponentType( ) )
   {
-    if( tIt->second.second == "char" )
-      r = this->_GD1< char, D >( );
-    else if( tIt->second.second == "short" )
-      r = this->_GD1< short, D >( );
-    else if( tIt->second.second == "int" )
-      r = this->_GD1< int, D >( );
-    else if( tIt->second.second == "long" )
-      r = this->_GD1< long, D >( );
-    else if( tIt->second.second == "uchar" )
-      r = this->_GD1< unsigned char, D >( );
-    else if( tIt->second.second == "ushort" )
-      r = this->_GD1< unsigned short, D >( );
-    else if( tIt->second.second == "uint" )
-      r = this->_GD1< unsigned int, D >( );
-    else if( tIt->second.second == "ulong" )
-      r = this->_GD1< unsigned long, D >( );
-    else if( tIt->second.second == "float" )
-      r = this->_GD1< float, D >( );
-    else if( tIt->second.second == "double" )
-      r = this->_GD1< double, D >( );
-  }
-  else if( cIt->second.second == "1" )
-  {
-    if( tIt->second.second == "char" )
-      r = this->_GD1< itk::RGBPixel< char >, D >( );
-    else if( tIt->second.second == "short" )
-      r = this->_GD1< itk::RGBPixel< short >, D >( );
-    else if( tIt->second.second == "int" )
-      r = this->_GD1< itk::RGBPixel< int >, D >( );
-    else if( tIt->second.second == "long" )
-      r = this->_GD1< itk::RGBPixel< long >, D >( );
-    else if( tIt->second.second == "uchar" )
-      r = this->_GD1< itk::RGBPixel< unsigned char >, D >( );
-    else if( tIt->second.second == "ushort" )
-      r = this->_GD1< itk::RGBPixel< unsigned short >, D >( );
-    else if( tIt->second.second == "uint" )
-      r = this->_GD1< itk::RGBPixel< unsigned int >, D >( );
-    else if( tIt->second.second == "ulong" )
-      r = this->_GD1< itk::RGBPixel< unsigned long >, D >( );
-    else if( tIt->second.second == "float" )
-      r = this->_GD1< itk::RGBPixel< float >, D >( );
-    else if( tIt->second.second == "double" )
-      r = this->_GD1< itk::RGBPixel< double >, D >( );
-  } // fi
+  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 );
 }
 
 // -------------------------------------------------------------------------
 template< class P, unsigned int D >
 std::string cpPlugins::Plugins::ImageReader::
-_GD1( )
+_GD1( itk::ImageIOBase* io, const TStringList& names )
 {
-  TParameters::const_iterator fIt;
-
-  // Get filename
-  fIt = this->m_Parameters.find( "FileName" );
-  if( fIt == this->m_Parameters.end( ) )
-    fIt = this->m_DefaultParameters.find( "FileName" );
+  std::string r = "";
+  switch( io->GetPixelType( ) )
+  {
+  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
+  return( r );
+}
 
-  typedef itk::Image< P, D > _TImage;
-  typedef itk::ImageFileReader< _TImage > _TImageReader;
+// -------------------------------------------------------------------------
+template< class P, unsigned int D >
+std::string cpPlugins::Plugins::ImageReader::
+_GD2( const TStringList& names )
+{
+  typedef itk::Image< P, D > _I;
 
-  _TImageReader* reader =
-    dynamic_cast< _TImageReader* >( this->m_Reader.GetPointer( ) );
-  if( reader == NULL )
+  std::string r = "";
+  if( names.size( ) == 1 )
   {
-    this->m_Reader = _TImageReader::New( );
-    reader = dynamic_cast< _TImageReader* >( this->m_Reader.GetPointer( ) );
+    // 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( fIt->second.second );
-  try
-  {
-    reader->Update( );
+    } // fi
+    reader->SetFileName( names[ 0 ] );
+    try
+    {
+      reader->Update( );
+      this->m_Outputs[ 0 ]->SetITKDataObject( reader->GetOutput( ) );
+    }
+    catch( itk::ExceptionObject& err )
+    {
+      r = "ImageReader: " + std::string( err.GetDescription( ) );
+      this->m_Outputs[ 0 ]->SetITKDataObject( NULL );
+
+    } // yrt
   }
-  catch( itk::ExceptionObject& err )
+  else if( names.size( ) > 1 )
   {
-    return( err.GetDescription( ) );
+    // 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( ) );
 
-  } // yrt
-  this->_SetOutput( 0, reader->GetOutput( ) );
-  return( "" );
+    } // 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( ) );
+    }
+    catch( itk::ExceptionObject& err )
+    {
+      r = "ImageReader: " + std::string( err.GetDescription( ) );
+      this->m_Outputs[ 0 ]->SetITKDataObject( NULL );
+
+    } // yrt
+  }
+  else
+    r = "ImageReader: No image files given";
+  return( r );
 }
 
 // eof - $RCSfile$