]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Plugins/ImageReader.cxx
...
[cpPlugins.git] / lib / cpPlugins / Plugins / ImageReader.cxx
index 2d1ae0493887d5cc8976be55a595eea88b118420..24399718c9e5477f8c6a45fb6461abe95e5e0570 100644 (file)
@@ -1,11 +1,21 @@
 #include <cpPlugins/Plugins/ImageReader.h>
 #include <cpPlugins/Interface/Image.h>
 
+#include <complex>
 #include <set>
 
-#undef ITK_MANUAL_INSTANTIATION
+#define ITK_MANUAL_INSTANTIATION
 #include <itkImage.h>
+
+#include <itkCovariantVector.h>
+#include <itkDiffusionTensor3D.h>
+#include <itkPoint.h>
 #include <itkRGBPixel.h>
+#include <itkRGBAPixel.h>
+#include <itkSymmetricSecondRankTensor.h>
+#include <itkVector.h>
+
+#undef ITK_MANUAL_INSTANTIATION
 #include <itkImageFileReader.h>
 #include <itkImageSeriesReader.h>
 
@@ -59,8 +69,9 @@ _GenerateData( )
         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;
+        case 4: r = this->_GD0< 4 >( io, names ); break;
         default:
-          r = "ImageReader: Image dimension not supported.";
+          r = "ImageReader: Single image dimension not supported.";
           break;
         } // hctiws
       }
@@ -70,8 +81,9 @@ _GenerateData( )
         {
         case 1: r = this->_GD0< 2 >( io, names ); break;
         case 2: r = this->_GD0< 3 >( io, names ); break;
+        case 3: r = this->_GD0< 4 >( io, names ); break;
         default:
-          r = "ImageReader: Image dimension not supported.";
+          r = "ImageReader: Multiple images dimension not supported.";
           break;
         } // hctiws
 
@@ -90,105 +102,319 @@ template< unsigned int D >
 std::string cpPlugins::Plugins::ImageReader::
 _GD0( itk::ImageIOBase* io, const TStringList& names )
 {
+  itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
+  itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
   std::string r = "";
-  switch( io->GetComponentType( ) )
+
+  if( pt == itk::ImageIOBase::SCALAR )
   {
-  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 );
-}
+    switch( ct )
+    {
+    case itk::ImageIOBase::UCHAR:
+      r = this->_RealGD< unsigned char, D >( names );
+      break;
+    case itk::ImageIOBase::CHAR:
+      r = this->_RealGD< char, D >( names );
+      break;
+    case itk::ImageIOBase::USHORT:
+      r = this->_RealGD< unsigned short, D >( names );
+      break;
+    case itk::ImageIOBase::SHORT:
+      r = this->_RealGD< short, D >( names );
+      break;
+    case itk::ImageIOBase::UINT:
+      r = this->_RealGD< unsigned int, D >( names );
+      break;
+    case itk::ImageIOBase::INT:
+      r = this->_RealGD< int, D >( names );
+      break;
+    case itk::ImageIOBase::ULONG:
+      r = this->_RealGD< unsigned long, D >( names );
+      break;
+    case itk::ImageIOBase::LONG:
+      r = this->_RealGD< long, D >( names );
+      break;
+    case itk::ImageIOBase::FLOAT:
+      r = this->_RealGD< float, D >( names );
+      break;
+    case itk::ImageIOBase::DOUBLE:
+      r = this->_RealGD< double, D >( names );
+      break;
+    default:
+      r = "ImageReader: Scalar pixel type not supported.";
+      break;
+    } // hctiws
+  }
+  else if( pt == itk::ImageIOBase::RGB )
+  {
+    if( D == 2 )
+    {
+      switch( ct )
+      {
+      case itk::ImageIOBase::UCHAR:
+        r = this->_RealGD< itk::RGBPixel< unsigned char >, 2 >( names );
+        break;
+      case itk::ImageIOBase::CHAR:
+        r = this->_RealGD< itk::RGBPixel< char >, 2 >( names );
+        break;
+      case itk::ImageIOBase::USHORT:
+        r = this->_RealGD< itk::RGBPixel< unsigned short >, 2 >( names );
+        break;
+      case itk::ImageIOBase::SHORT:
+        r = this->_RealGD< itk::RGBPixel< short >, 2 >( names );
+        break;
+      default:
+        r = "ImageReader: Scalar pixel type not supported.";
+        break;
+      } // hctiws
+    }
+    else if( D == 3 )
+    {
+      switch( ct )
+      {
+      case itk::ImageIOBase::UCHAR:
+        r = this->_RealGD< itk::RGBPixel< unsigned char >, 3 >( names );
+        break;
+      case itk::ImageIOBase::CHAR:
+        r = this->_RealGD< itk::RGBPixel< char >, 3 >( names );
+        break;
+      case itk::ImageIOBase::USHORT:
+        r = this->_RealGD< itk::RGBPixel< unsigned short >, 3 >( names );
+        break;
+      case itk::ImageIOBase::SHORT:
+        r = this->_RealGD< itk::RGBPixel< short >, 3 >( names );
+        break;
+      default:
+        r = "ImageReader: Scalar pixel type not supported.";
+        break;
+      } // hctiws
+    }
+    else if( D == 4 )
+    {
+      switch( ct )
+      {
+      case itk::ImageIOBase::UCHAR:
+        r = this->_RealGD< itk::RGBPixel< unsigned char >, 4 >( names );
+        break;
+      case itk::ImageIOBase::CHAR:
+        r = this->_RealGD< itk::RGBPixel< char >, 4 >( names );
+        break;
+      case itk::ImageIOBase::USHORT:
+        r = this->_RealGD< itk::RGBPixel< unsigned short >, 4 >( names );
+        break;
+      case itk::ImageIOBase::SHORT:
+        r = this->_RealGD< itk::RGBPixel< short >, 4 >( names );
+        break;
+      default:
+        r = "ImageReader: Scalar pixel type not supported.";
+        break;
+      } // hctiws
 
-// -------------------------------------------------------------------------
-template< class P, unsigned int D >
-std::string cpPlugins::Plugins::ImageReader::
-_GD1( itk::ImageIOBase* io, const TStringList& names )
-{
-  std::string r = "";
-  switch( io->GetPixelType( ) )
+    } // fi
+  }
+  else if( pt == itk::ImageIOBase::RGBA )
+  {
+    if( D == 2 )
+    {
+      switch( ct )
+      {
+      case itk::ImageIOBase::UCHAR:
+        r = this->_RealGD< itk::RGBAPixel< unsigned char >, 2 >( names );
+        break;
+      case itk::ImageIOBase::CHAR:
+        r = this->_RealGD< itk::RGBAPixel< char >, 2 >( names );
+        break;
+      case itk::ImageIOBase::USHORT:
+        r = this->_RealGD< itk::RGBAPixel< unsigned short >, 2 >( names );
+        break;
+      case itk::ImageIOBase::SHORT:
+        r = this->_RealGD< itk::RGBAPixel< short >, 2 >( names );
+        break;
+      default:
+        r = "ImageReader: Scalar pixel type not supported.";
+        break;
+      } // hctiws
+    }
+    else if( D == 3 )
+    {
+      switch( ct )
+      {
+      case itk::ImageIOBase::UCHAR:
+        r = this->_RealGD< itk::RGBAPixel< unsigned char >, 3 >( names );
+        break;
+      case itk::ImageIOBase::CHAR:
+        r = this->_RealGD< itk::RGBAPixel< char >, 3 >( names );
+        break;
+      case itk::ImageIOBase::USHORT:
+        r = this->_RealGD< itk::RGBAPixel< unsigned short >, 3 >( names );
+        break;
+      case itk::ImageIOBase::SHORT:
+        r = this->_RealGD< itk::RGBAPixel< short >, 3 >( names );
+        break;
+      default:
+        r = "ImageReader: Scalar pixel type not supported.";
+        break;
+      } // hctiws
+    }
+    else if( D == 4 )
+    {
+      switch( ct )
+      {
+      case itk::ImageIOBase::UCHAR:
+        r = this->_RealGD< itk::RGBAPixel< unsigned char >, 4 >( names );
+        break;
+      case itk::ImageIOBase::CHAR:
+        r = this->_RealGD< itk::RGBAPixel< char >, 4 >( names );
+        break;
+      case itk::ImageIOBase::USHORT:
+        r = this->_RealGD< itk::RGBAPixel< unsigned short >, 4 >( names );
+        break;
+      case itk::ImageIOBase::SHORT:
+        r = this->_RealGD< itk::RGBAPixel< short >, 4 >( names );
+        break;
+      default:
+        r = "ImageReader: Scalar pixel type not supported.";
+        break;
+      } // hctiws
+
+    } // fi
+  }
+  else if( pt == itk::ImageIOBase::OFFSET )
+  {
+    switch( D )
+    {
+    case 1:
+      r = this->_RealGD< itk::Offset< 1 >, 1 >( names );
+      break;
+    case 2:
+      r = this->_RealGD< itk::Offset< 2 >, 2 >( names );
+      break;
+    case 3:
+      r = this->_RealGD< itk::Offset< 3 >, 3 >( names );
+      break;
+    case 4:
+      r = this->_RealGD< itk::Offset< 4 >, 4 >( names );
+      break;
+    default:
+      r = "ImageReader: Offset pixel dimension not supported.";
+      break;
+    } // hctiws
+  }
+  else if( pt == itk::ImageIOBase::VECTOR )
+  {
+    switch( ct )
+    {
+    case itk::ImageIOBase::FLOAT:
+      r = this->_RealGD< itk::Vector< float, D >, D >( names );
+      break;
+    case itk::ImageIOBase::DOUBLE:
+      r = this->_RealGD< itk::Vector< double, D >, D >( names );
+      break;
+    default:
+      r = "ImageReader: Vector type not supported.";
+      break;
+    } // hctiws
+  }
+  else if( pt == itk::ImageIOBase::POINT )
   {
-  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
+    switch( ct )
+    {
+    case itk::ImageIOBase::FLOAT:
+      r = this->_RealGD< itk::Point< float, D >, D >( names );
+      break;
+    case itk::ImageIOBase::DOUBLE:
+      r = this->_RealGD< 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->_RealGD< itk::CovariantVector< float, D >, D >( names );
+      break;
+    case itk::ImageIOBase::DOUBLE:
+      r = this->_RealGD< itk::CovariantVector< double, D >, D >( names );
+      break;
+    default:
+      r = "ImageReader: Vector type not supported.";
+      break;
+    } // hctiws
+  }
+  else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
+  {
+    switch( ct )
+    {
+    case itk::ImageIOBase::FLOAT:
+      r =
+        this->_RealGD< itk::SymmetricSecondRankTensor< float, D >, D >(
+          names
+          );
+      break;
+    case itk::ImageIOBase::DOUBLE:
+      r =
+        this->_RealGD< itk::SymmetricSecondRankTensor< double, D >, D >(
+          names
+          );
+      break;
+    default:
+      r = "ImageReader: Vector type not supported.";
+      break;
+    } // hctiws
+  }
+  else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
+  {
+    if( D == 3 )
+    {
+      switch( ct )
+      {
+      case itk::ImageIOBase::FLOAT:
+        r = this->_RealGD< itk::DiffusionTensor3D< float >, 3 >( names );
+        break;
+      case itk::ImageIOBase::DOUBLE:
+        r = this->_RealGD< itk::DiffusionTensor3D< double >, 3 >( names );
+        break;
+      default:
+        r = "ImageReader: Diffusion tensor type not supported.";
+        break;
+      } // hctiws
+    }
+    else
+      r = "ImageReader: Diffusion tensor dimension not supported.";
+  }
+  else if( pt == itk::ImageIOBase::COMPLEX )
+  {
+    switch( ct )
+    {
+    case itk::ImageIOBase::FLOAT:
+      r = this->_RealGD< std::complex< float >, D >( names );
+      break;
+    case itk::ImageIOBase::DOUBLE:
+      r = this->_RealGD< std::complex< double >, D >( names );
+      break;
+    default:
+      r = "ImageReader: Complex type not supported.";
+      break;
+    } // hctiws
+  }
+  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::Plugins::ImageReader::
-_GD2( const TStringList& names )
+_RealGD( const TStringList& names )
 {
   typedef itk::Image< P, D > _I;