]> Creatis software - clitk.git/blobdiff - vv/vvImageReader.txx
Propagate new parameters after hitting r
[clitk.git] / vv / vvImageReader.txx
index af11299b9e4497f0a715636ae864b866745992ce..e2e98bb2d125f5bdf76e23281c00e95a0856a116 100644 (file)
@@ -27,6 +27,7 @@
 #include <vtkTransform.h>
 
 #include "clitkCommon.h"
+#include "clitkConfiguration.h"
 #include "vvFromITK.h"
 #include "vvConstants.h"
 
@@ -67,25 +68,20 @@ void vvImageReader::UpdateWithDim(std::string InputPixelType)
 template<class InputPixelType, unsigned int VImageDimension>
 void vvImageReader::UpdateWithDimAndInputPixelType()
 {
-
-  //  DD(mType);
-
   if (mType == MERGEDWITHTIME)   // In this case we can load the images
     // one at the time to avoid excessive
     // memory use
   {
-    typedef itk::Image< InputPixelType, VImageDimension-1 > InputImageType;
-    typedef itk::ImageFileReader<InputImageType> ReaderType;
-    typename ReaderType::Pointer reader = ReaderType::New();
-    typedef itk::ImageToVTKImageFilter <InputImageType> ConnectorType;
-    typename ConnectorType::Pointer connector = ConnectorType::New();
-    connector->SetInput(reader->GetOutput());
     mImage=vvImage::New();
+
     for (std::vector<std::string>::const_iterator i=mInputFilenames.begin(); i!=mInputFilenames.end(); i++) {
-      std::cout << (*i) << std::endl;
+      typedef itk::Image< InputPixelType, VImageDimension-1 > InputImageType;
+      typedef itk::ImageFileReader<InputImageType> ReaderType;
+      typename ReaderType::Pointer reader = ReaderType::New();
+      reader->ReleaseDataFlagOn();
       reader->SetFileName(*i);
       try {
-        reader->Update();
+        mImage->AddItkImage<InputImageType>(reader->GetOutput());
       } catch ( itk::ExceptionObject & err ) {
         std::cerr << "Error while reading " << mInputFilenames[0].c_str()
                   << " " << err << std::endl;
@@ -94,29 +90,53 @@ void vvImageReader::UpdateWithDimAndInputPixelType()
         mLastError = error.str();
         return;
       }
-      try {
-        connector->Update();
-      } catch ( itk::ExceptionObject & err ) {
-        std::cerr << "Error while setting vvImage from ITK (MERGEDWITHTIME)"
-                  << " " << err << std::endl;
-      }
-      vtkImageData *image = vtkImageData::New();
-      image->ShallowCopy(connector->GetOutput());
-      mImage->AddImage(image);
+    }
+  } else if (mType == SLICED) {
+    mImage=vvImage::New();
+    typedef itk::Image< InputPixelType, VImageDimension > InputImageType;
+    typedef itk::ImageFileReader<InputImageType> ReaderType;
+    typename ReaderType::Pointer reader = ReaderType::New();
+    reader->SetFileName(mInputFilenames[0]);
+    reader->UpdateOutputInformation();
+
+    typedef itk::Image< InputPixelType, VImageDimension-1 > SlicedImageType;
+    typedef itk::ExtractImageFilter<InputImageType, SlicedImageType> FilterType;
+
+    typename InputImageType::RegionType inputRegion = reader->GetOutput()->GetLargestPossibleRegion();
+    typename InputImageType::SizeType inputSize = inputRegion.GetSize();
+    typename InputImageType::IndexType start = inputRegion.GetIndex();
+    typename InputImageType::SizeType extractedRegionSize = inputSize;
+    typename InputImageType::RegionType extractedRegion;
+    extractedRegionSize[VImageDimension - 1] = 0;
+    extractedRegion.SetSize(extractedRegionSize);
+    start[VImageDimension - 1] = mSlice;
+    extractedRegion.SetIndex(start);
+
+    typename FilterType::Pointer filter = FilterType::New();
+    filter->SetExtractionRegion(extractedRegion);
+    filter->SetInput(reader->GetOutput());
+    filter->ReleaseDataFlagOn();
+    try {
+      mImage->AddItkImage<SlicedImageType>(filter->GetOutput());
+    }
+    catch ( itk::ExceptionObject & err ) {
+      std::cerr << "Error while slicing " << mInputFilenames[0].c_str()
+                << "(slice #" << mSlice << ") " << err << std::endl;
+      return;
     }
   } else {
     if (mInputFilenames.size() > 1) {
       typedef itk::Image< InputPixelType, VImageDimension > InputImageType;
       typedef itk::ImageSeriesReader<InputImageType> ReaderType;
       typename ReaderType::Pointer reader = ReaderType::New();
-      for (std::vector<std::string>::const_iterator i=mInputFilenames.begin(); i!=mInputFilenames.end(); i++)
-        std::cout << (*i) << std::endl;
       reader->SetFileNames(mInputFilenames);
-      //if (mUseAnObserver) {
-      //reader->AddObserver(itk::ProgressEvent(), mObserver);
-      //}
+      reader->ReleaseDataFlagOn();
+
       try {
-        reader->Update();
+        if (mType == IMAGEWITHTIME)
+          mImage=vvImageFromITK<VImageDimension,InputPixelType>(reader->GetOutput(),true);
+        else
+          mImage=vvImageFromITK<VImageDimension,InputPixelType>(reader->GetOutput());
       } catch ( itk::ExceptionObject & err ) {
         std::cerr << "Error while reading image series:" << err << std::endl;
         std::stringstream error;
@@ -124,27 +144,18 @@ void vvImageReader::UpdateWithDimAndInputPixelType()
         mLastError = error.str();
         return;
       }
-
-      // DD(reader->GetOutput()->GetImageDimension());
-      //           DD(reader->GetOutput()->GetNumberOfComponentsPerPixel());
-      //           for(unsigned int i=0; i <reader->GetOutput()->GetImageDimension(); i++) {
-      //             DD(reader->GetOutput()->GetSpacing()[i]);
-      //           }
-
-      if (mType == IMAGEWITHTIME)
-        mImage=vvImageFromITK<VImageDimension,InputPixelType>(reader->GetOutput(),true);
-      else
-        mImage=vvImageFromITK<VImageDimension,InputPixelType>(reader->GetOutput());
     } else {
       typedef itk::Image< InputPixelType, VImageDimension > InputImageType;
       typedef itk::ImageFileReader<InputImageType> ReaderType;
       typename ReaderType::Pointer reader = ReaderType::New();
       reader->SetFileName(mInputFilenames[0]);
-      //if (mUseAnObserver) {
-      //reader->AddObserver(itk::ProgressEvent(), mObserver);
-      //}
+      reader->ReleaseDataFlagOn();
+
       try {
-        reader->Update();
+        if (mType == IMAGEWITHTIME)
+          mImage=vvImageFromITK<VImageDimension,InputPixelType>(reader->GetOutput(),true);
+        else
+          mImage=vvImageFromITK<VImageDimension,InputPixelType>(reader->GetOutput());
       } catch ( itk::ExceptionObject & err ) {
         std::cerr << "Error while reading " << mInputFilenames[0].c_str()
                   << " " << err << std::endl;
@@ -153,19 +164,6 @@ void vvImageReader::UpdateWithDimAndInputPixelType()
         mLastError = error.str();
         return;
       }
-
-      // DD(reader->GetOutput()->GetImageDimension());
-      //           DD(reader->GetOutput()->GetNumberOfComponentsPerPixel());
-      //           for(unsigned int i=0; i <reader->GetOutput()->GetImageDimension(); i++) {
-      //             DD(reader->GetOutput()->GetSpacing()[i]);
-      //             DD(reader->GetOutput()->GetOrigin()[i]);
-      //           }
-
-
-      if (mType == IMAGEWITHTIME)
-        mImage=vvImageFromITK<VImageDimension,InputPixelType>(reader->GetOutput(),true);
-      else
-        mImage=vvImageFromITK<VImageDimension,InputPixelType>(reader->GetOutput());
     }
   }
 }