]> Creatis software - clitk.git/blobdiff - tools/clitkResampleImageGenericFilter.txx
Merge branch 'master' into vectorImage
[clitk.git] / tools / clitkResampleImageGenericFilter.txx
index e1c2d43497c7a68a1cd1ff1e19814525fcd050cb..7ecf84298ba01aad9a1a63b749ed326857681309 100644 (file)
@@ -3,7 +3,7 @@
 
   Authors belong to:
   - University of LYON              http://www.universite-lyon.fr/
-  - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
+  - Léon Bérard cancer center       http://www.centreleonberard.fr
   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
 
   This software is distributed WITHOUT ANY WARRANTY; without even
@@ -14,7 +14,7 @@
 
   - BSD        See included LICENSE.txt file
   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-  ======================================================================-====*/
+  ===========================================================================**/
 
 #ifndef CLITKRESAMPLEIMAGEGENERICFILTER_TXX
 #define CLITKRESAMPLEIMAGEGENERICFILTER_TXX
@@ -49,40 +49,68 @@ clitk::ResampleImageGenericFilter::UpdateWithInputImageType()
   static const unsigned int dim = OutputImageType::ImageDimension;
   typename OutputImageType::SpacingType spacing;
   typename OutputImageType::SizeType size;
+  typename OutputImageType::PointType origin;
+  typename OutputImageType::DirectionType direction;
 
   if (mArgsInfo.like_given) {
-    DD("like");
-    
+    itk::ImageIOBase::Pointer header = clitk::readImageHeader(mArgsInfo.like_arg);
+    if (header) {
+      for(unsigned int i=0; i<dim; i++){
+        spacing[i] = header->GetSpacing(i);
+        size[i] = header->GetDimensions(i);
+        origin[i] = header->GetOrigin(i);
+      }
+      for(unsigned int i=0; i<dim; i++) {
+        for(unsigned int j=0;j<dim;j++) {
+            direction(i,j) = header->GetDirection(i)[j];
+        }
+      }
+      filter->SetOutputSpacing(spacing);
+      filter->SetOutputSize(size);
+      filter->SetOutputOrigin(origin);
+      filter->SetOutputDirection(direction);
+    }
+    else {
+      std::cerr << "*** Warning : I could not read '" << mArgsInfo.like_arg << "' ***" << std::endl;
+      exit(0);
+    }
   }
   else {
     if (mArgsInfo.spacing_given == 1) {
       filter->SetOutputIsoSpacing(mArgsInfo.spacing_arg[0]);
-    } else {
-      if ((mArgsInfo.spacing_given != 0) && (mArgsInfo.size_given != 0)) {
-        std::cerr << "Error: use spacing or size, not both." << std::endl;
+    }
+    else if ((mArgsInfo.spacing_given != 0) && (mArgsInfo.size_given != 0)) {
+      std::cerr << "Error: use spacing or size, not both." << std::endl;
+      exit(0);
+    }
+    else if (mArgsInfo.spacing_given) {
+      if ((mArgsInfo.spacing_given != 0) && (mArgsInfo.spacing_given != dim)) {
+        std::cerr << "Error: spacing should have one or " << dim << " values." << std::endl;
         exit(0);
       }
-
-      if (!((mArgsInfo.spacing_given == 0) && (mArgsInfo.size_given == 0))) {
-
-        if ((mArgsInfo.spacing_given != 0) && (mArgsInfo.spacing_given != dim)) {
-          std::cerr << "Error: spacing should have one or " << dim << " values." << std::endl;
-          exit(0);
-        }
-        if ((mArgsInfo.size_given != 0) && (mArgsInfo.size_given != dim)) {
-          std::cerr << "Error: size should have " << dim << " values." << std::endl;
-          exit(0);
-        }
-        if (mArgsInfo.spacing_given)
-          for(unsigned int i=0; i<dim; i++)
-            spacing[i] = mArgsInfo.spacing_arg[i];
-        if (mArgsInfo.size_given)
-          for(unsigned int i=0; i<dim; i++)
-            size[i] = mArgsInfo.size_arg[i];
-        filter->SetOutputSpacing(spacing);
-        filter->SetOutputSize(size);
+      for(unsigned int i=0; i<dim; i++)
+        spacing[i] = mArgsInfo.spacing_arg[i];
+      filter->SetOutputSpacing(spacing);
+    }
+    else if (mArgsInfo.size_given) {
+      if ((mArgsInfo.size_given != 0) && (mArgsInfo.size_given != dim)) {
+        std::cerr << "Error: size should have " << dim << " values." << std::endl;
+        exit(0);
+      }
+      for(unsigned int i=0; i<dim; i++)
+        size[i] = mArgsInfo.size_arg[i];
+      filter->SetOutputSize(size);
+    }
+    for(unsigned int i=0; i<dim; i++){
+      origin[i] = input->GetOrigin()[i];
+    }
+    for(unsigned int i=0; i<dim; i++) {
+      for(unsigned int j=0;j<dim;j++) {
+          direction(i,j) = input->GetDirection()[i][j];
       }
     }
+    filter->SetOutputOrigin(origin);
+    filter->SetOutputDirection(direction);
   }
 
   // Set temporal dimension