]> Creatis software - cpPlugins.git/blobdiff - plugins/cpPluginsIO/ImageReader.cxx
...
[cpPlugins.git] / plugins / cpPluginsIO / ImageReader.cxx
index c515c9e6fbc301da16ccaf39c4fdb0408be27f07..e10d3836d79d2f3cf171faf80f7c3b839d3fccd6 100644 (file)
@@ -1,11 +1,7 @@
 #include <cpPluginsIO/ImageReader.h>
 #include <cpPlugins/Image.h>
-
-#include <itkImageFileReader.h>
-#include <itkImageSeriesReader.h>
-#include <itkImageFileReader.hxx>
-#include <itkImageSeriesReader.hxx>
-#include <itkImageAlgorithm.hxx>
+#include <cpPlugins_Instances/ImagesIO.h>
+#include <itkImageIOFactory.h>
 
 // -------------------------------------------------------------------------
 cpPluginsIO::ImageReader::
@@ -28,12 +24,11 @@ cpPluginsIO::ImageReader::
 }
 
 // -------------------------------------------------------------------------
-std::string cpPluginsIO::ImageReader::
+void cpPluginsIO::ImageReader::
 _GenerateData( )
 {
   // Get filenames
   auto fnames = this->m_Parameters.GetOpenFileNameList( "FileNames" );
-  std::string r = "";
   if( fnames.size( ) >= 1 )
   {
     // Guess image properties
@@ -50,92 +45,99 @@ _GenerateData( )
       {
         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;
+          // TODO: case 1: r = this->_GD0< 1 >( io ); break;
+        case 2: this->_GD0< 2 >( io ); break;
+        case 3: this->_GD0< 3 >( io ); break;
+          // TODO: case 4: r = this->_GD0< 4 >( io ); break;
         default:
-          r = "IO::ImageReader: Image dimension not supported.";
+          this->_Error( "Image dimension not supported." );
           break;
         } // hctiws
 
       } // fi
     }
     else
-      r =
-        "IO::ImageReader: Could not CreateImageIO for \"" +
+      this->_Error(
+        std::string( "Could not create an ImageIO for \"" ) +
         fnames[ 0 ] +
-        "\"";
+        std::string( "\"" )
+        );
   }
   else
-    r = "IO::ImageReader: No image(s) given";
-  return( r );
+    this->_Error( "No image(s) given" );
 }
 
 // -------------------------------------------------------------------------
-template< unsigned int D >
-std::string cpPluginsIO::ImageReader::
+template< unsigned int _Dim >
+void 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, D >( io ); break;
-    case itk::ImageIOBase::SHORT  : r = this->_GD1<          short, D >( io ); break;
-    case itk::ImageIOBase::INT    : r = this->_GD1<            int, D >( io ); break;
-    case itk::ImageIOBase::LONG   : r = this->_GD1<           long, D >( io ); break;
-    case itk::ImageIOBase::FLOAT  : r = this->_GD1<          float, D >( io ); break;
-    case itk::ImageIOBase::DOUBLE : r = this->_GD1<         double, D >( io ); break;
-    case itk::ImageIOBase::UCHAR  : r = this->_GD1<  unsigned char, D >( io ); break;
-    case itk::ImageIOBase::USHORT : r = this->_GD1< unsigned short, D >( io ); break;
-    case itk::ImageIOBase::UINT   : r = this->_GD1<   unsigned int, D >( io ); break;
-    case itk::ImageIOBase::ULONG  : r = this->_GD1<  unsigned long, D >( io ); break;
-    default:
-      r = "IO::ImageReader: Scalar pixel type not supported.";
-      break;
+    case itk::ImageIOBase::CHAR   : this->_GD1<   char, _Dim >( io ); break;
+    case itk::ImageIOBase::SHORT  : this->_GD1<  short, _Dim >( io ); break;
+    case itk::ImageIOBase::INT    : this->_GD1<    int, _Dim >( io ); break;
+    case itk::ImageIOBase::LONG   : this->_GD1<   long, _Dim >( io ); break;
+    case itk::ImageIOBase::FLOAT  : this->_GD1<  float, _Dim >( io ); break;
+    case itk::ImageIOBase::DOUBLE : this->_GD1< double, _Dim >( io ); break;
+    case itk::ImageIOBase::UCHAR  : this->_GD1<  uchar, _Dim >( io ); break;
+    case itk::ImageIOBase::USHORT : this->_GD1< ushort, _Dim >( io ); break;
+    case itk::ImageIOBase::UINT   : this->_GD1<   uint, _Dim >( io ); break;
+    case itk::ImageIOBase::ULONG  : this->_GD1<  ulong, _Dim >( io ); break;
+    default: this->_Error( "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 >, D >( io ); break;
-    case itk::ImageIOBase::SHORT  : r = this->_GD1< itk::RGBPixel<          short >, D >( io ); break;
-    case itk::ImageIOBase::INT    : r = this->_GD1< itk::RGBPixel<            int >, D >( io ); break;
-    case itk::ImageIOBase::LONG   : r = this->_GD1< itk::RGBPixel<           long >, D >( io ); break;
-    case itk::ImageIOBase::FLOAT  : r = this->_GD1< itk::RGBPixel<          float >, D >( io ); break;
-    case itk::ImageIOBase::DOUBLE : r = this->_GD1< itk::RGBPixel<         double >, D >( io ); break;
-    case itk::ImageIOBase::UCHAR  : r = this->_GD1< itk::RGBPixel<  unsigned char >, D >( io ); break;
-    case itk::ImageIOBase::USHORT : r = this->_GD1< itk::RGBPixel< unsigned short >, D >( io ); break;
-    case itk::ImageIOBase::UINT   : r = this->_GD1< itk::RGBPixel<   unsigned int >, D >( io ); break;
-    case itk::ImageIOBase::ULONG  : r = this->_GD1< itk::RGBPixel<  unsigned long >, D >( io ); break;
-    default:
-      r = "IO::ImageReader: RGB pixel type not supported.";
-      break;
+    case itk::ImageIOBase::CHAR   : this->_GD1< itk::RGBPixel<   char >, _Dim >( io ); break;
+    case itk::ImageIOBase::SHORT  : this->_GD1< itk::RGBPixel<  short >, _Dim >( io ); break;
+    case itk::ImageIOBase::INT    : this->_GD1< itk::RGBPixel<    int >, _Dim >( io ); break;
+    case itk::ImageIOBase::LONG   : this->_GD1< itk::RGBPixel<   long >, _Dim >( io ); break;
+    case itk::ImageIOBase::FLOAT  : this->_GD1< itk::RGBPixel<  float >, _Dim >( io ); break;
+    case itk::ImageIOBase::DOUBLE : this->_GD1< itk::RGBPixel< double >, _Dim >( io ); break;
+    case itk::ImageIOBase::UCHAR  : this->_GD1< itk::RGBPixel<  uchar >, _Dim >( io ); break;
+    case itk::ImageIOBase::USHORT : this->_GD1< itk::RGBPixel< ushort >, _Dim >( io ); break;
+    case itk::ImageIOBase::UINT   : this->_GD1< itk::RGBPixel<   uint >, _Dim >( io ); break;
+    case itk::ImageIOBase::ULONG  : this->_GD1< itk::RGBPixel<  ulong >, _Dim >( io ); break;
+    default: this->_Error( "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 >, D >( io ); break;
-    case itk::ImageIOBase::SHORT  : r = this->_GD1< itk::RGBAPixel<          short >, D >( io ); break;
-    case itk::ImageIOBase::INT    : r = this->_GD1< itk::RGBAPixel<            int >, D >( io ); break;
-    case itk::ImageIOBase::LONG   : r = this->_GD1< itk::RGBAPixel<           long >, D >( io ); break;
-    case itk::ImageIOBase::FLOAT  : r = this->_GD1< itk::RGBAPixel<          float >, D >( io ); break;
-    case itk::ImageIOBase::DOUBLE : r = this->_GD1< itk::RGBAPixel<         double >, D >( io ); break;
-    case itk::ImageIOBase::UCHAR  : r = this->_GD1< itk::RGBAPixel<  unsigned char >, D >( io ); break;
-    case itk::ImageIOBase::USHORT : r = this->_GD1< itk::RGBAPixel< unsigned short >, D >( io ); break;
-    case itk::ImageIOBase::UINT   : r = this->_GD1< itk::RGBAPixel<   unsigned int >, D >( io ); break;
-    case itk::ImageIOBase::ULONG  : r = this->_GD1< itk::RGBAPixel<  unsigned long >, D >( io ); break;
-    default:
-      r = "IO::ImageReader: RGBA pixel type not supported.";
-      break;
+    case itk::ImageIOBase::CHAR   : this->_GD1< itk::RGBAPixel<   char >, _Dim >( io ); break;
+    case itk::ImageIOBase::SHORT  : this->_GD1< itk::RGBAPixel<  short >, _Dim >( io ); break;
+    case itk::ImageIOBase::INT    : this->_GD1< itk::RGBAPixel<    int >, _Dim >( io ); break;
+    case itk::ImageIOBase::LONG   : this->_GD1< itk::RGBAPixel<   long >, _Dim >( io ); break;
+    case itk::ImageIOBase::FLOAT  : this->_GD1< itk::RGBAPixel<  float >, _Dim >( io ); break;
+    case itk::ImageIOBase::DOUBLE : this->_GD1< itk::RGBAPixel< double >, _Dim >( io ); break;
+    case itk::ImageIOBase::UCHAR  : this->_GD1< itk::RGBAPixel<  uchar >, _Dim >( io ); break;
+    case itk::ImageIOBase::USHORT : this->_GD1< itk::RGBAPixel< ushort >, _Dim >( io ); break;
+    case itk::ImageIOBase::UINT   : this->_GD1< itk::RGBAPixel<   uint >, _Dim >( io ); break;
+    case itk::ImageIOBase::ULONG  : this->_GD1< itk::RGBAPixel<  ulong >, _Dim >( io ); break;
+    default: this->_Error( "RGBA pixel type not supported." ); break;
+    } // hctiws
+  }
+  else if( pt == itk::ImageIOBase::COMPLEX )
+  {
+    switch( ct )
+    {
+    case itk::ImageIOBase::FLOAT  : this->_GD1< std::complex< float >, _Dim >( io ); break;
+    case itk::ImageIOBase::DOUBLE : this->_GD1< std::complex< double >, _Dim >( io ); break;
+    default: this->_Error( "Complex pixel type not supported." ); break;
     } // hctiws
   }
   /* TODO
@@ -154,9 +156,6 @@ _GD0( itk::ImageIOBase* io )
      else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
      {
      }
-     else if( pt == itk::ImageIOBase::COMPLEX )
-     {
-     }
      else if( pt == itk::ImageIOBase::OFFSET )
      {
      }
@@ -168,23 +167,21 @@ _GD0( itk::ImageIOBase* io )
      }
   */
   else
-    r = "IO::ImageReader: Image pixel type not yet supported.";
-  return( r );
+    this->_Error( "Image pixel type not yet supported." );
 }
 
 // -------------------------------------------------------------------------
-template< class P, unsigned int D >
-std::string cpPluginsIO::ImageReader::
+template< class _TPixel, unsigned int _Dim >
+void cpPluginsIO::ImageReader::
 _GD1( itk::ImageIOBase* io )
 {
-  typedef itk::Image< P, D > _I;
+  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< _I > >( );
+    auto f = this->_CreateITK< itk::ImageFileReader< _TImage > >( );
     f->SetFileName( fnames[ 0 ] );
     f->SetImageIO( io );
     try
@@ -194,12 +191,12 @@ _GD1( itk::ImageIOBase* io )
     }
     catch( itk::ExceptionObject& err )
     {
-      r = "IO::ImageReader: " + std::string( err.GetDescription( ) );
+      this->_Error( err.GetDescription( ) );
     }
   }
   else // if( fnames.size( ) > 1 )
   {
-    auto f = this->_CreateITK< itk::ImageSeriesReader< _I > >( );
+    auto f = this->_CreateITK< itk::ImageSeriesReader< _TImage > >( );
     for( auto i = fnames.begin( ); i != fnames.end( ); ++i )
       f->AddFileName( *i );
     f->SetImageIO( io );
@@ -210,11 +207,10 @@ _GD1( itk::ImageIOBase* io )
     }
     catch( itk::ExceptionObject& err )
     {
-      r = "IO::ImageReader: " + std::string( err.GetDescription( ) );
+      this->_Error( err.GetDescription( ) );
     }
 
   } // fi
-  return( r );
 }
 
 // eof - $RCSfile$