]> Creatis software - creaImageIO.git/blobdiff - src/creaImageIOImageReader.cpp
move directory
[creaImageIO.git] / src / creaImageIOImageReader.cpp
diff --git a/src/creaImageIOImageReader.cpp b/src/creaImageIOImageReader.cpp
new file mode 100644 (file)
index 0000000..4b67e04
--- /dev/null
@@ -0,0 +1,208 @@
+#include <creaImageIOImageReader.h>
+#include <creaImageIOTreeAttributeDescriptor.h>
+#include <creaImageIOSystem.h>
+
+#include <creaImageIOVtkImageReader.h>
+#if defined (USE_GDCM)
+       #include <creaImageIODicomImageReader.h>
+#endif
+#if defined(USE_GDCM2)
+       #include <creaImageIODicomImageReader2.h>
+#endif
+#include <creaImageIOUltrasonixImageReader.h>
+#include <vtkPNGReader.h>
+#include <vtkTIFFReader.h>
+#include <vtkJPEGReader.h>
+#include <vtkBMPReader.h>
+#include <vtkSLCReader.h>
+#include <vtkMetaImageReader.h>
+//#include <vtkGESignalReader.h>
+
+
+#include "boost/filesystem/path.hpp"
+
+namespace creaImageIO
+{
+  
+
+
+
+
+  //=====================================================================
+  ImageReader::ImageReader()
+    :   
+    mUnreadableImage(0),
+    mLastFilename("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&")
+  {
+    //    std::cout << "#### ImageReader::ImageReader()"<<std::endl;
+    if (mUnreadableImage!=0) return;
+       
+       Register( boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkPNGReader::New(), "PNG", ".png")));
+    Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkTIFFReader::New(), "JPEG", ".jpeg")));
+    Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkJPEGReader::New())));
+    Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkBMPReader::New())));
+    Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkSLCReader::New())));
+    Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkMetaImageReader::New(),"MHD",".mhd")));
+    //   Register(new VtkImageReader(vtkGESignalReader::New()));
+    Register(boost::shared_ptr<AbstractImageReader>(new DicomImageReader));
+    Register(boost::shared_ptr<AbstractImageReader>(new UltrasonixImageReader));
+
+       UnRegister(".txt");
+    mUnreadableImage = vtkImageData::New();
+    int dim[3];
+    dim[0] = dim[1] = 128; 
+    dim[2] = 1; 
+    mUnreadableImage->SetDimensions ( dim );
+    mUnreadableImage->SetScalarTypeToUnsignedChar();
+    mUnreadableImage->AllocateScalars();    
+    for (int i=0;i<dim[0];i++) 
+      for (int j=0;j<dim[1];j++) 
+       mUnreadableImage->SetScalarComponentFromFloat(i,j,0,0,0);
+    for (int i=0;i<dim[0];i++) 
+      {
+       mUnreadableImage->SetScalarComponentFromFloat(i,i,0,0,255);
+       mUnreadableImage->SetScalarComponentFromFloat(dim[0]-1-i,i,0,0,255);
+      }
+
+
+    
+  }
+  //=====================================================================
+
+  //=====================================================================
+  ImageReader::~ImageReader()
+  {
+
+ //   for (i=mReader.begin(); i!=mReader.end(); i++)
+ //     {
+       //delete (*i);
+ //     }
+//    mReader.clear();
+    if (mUnreadableImage!=0) 
+      {
+       mUnreadableImage->Delete();
+       mUnreadableImage = 0;
+      }
+  }
+  //=====================================================================
+
+  //=====================================================================
+  void ImageReader::Register(boost::shared_ptr<AbstractImageReader> r)
+  {
+    mReader.push_back(r);
+
+  }
+
+  void ImageReader::UnRegister(const std::string i_val)
+  {
+    mUnReader.push_back(i_val);
+
+  }
+  //=====================================================================
+
+   //=====================================================================
+  // Returns true iff the file is readable
+  bool ImageReader::ShallNotRead( const std::string& filename ) 
+  {
+    bool ok = true;
+       if(filename != "")
+       {
+               std::vector<std::string >::iterator i ;
+               for (i=mUnReader.begin(); i!=mUnReader.end(); i++)
+               {
+                       
+                       if ( (*i).c_str() == filename) 
+                       {
+                               ok = false;
+                               break;
+                       }
+               }
+       }
+       return ok;
+       
+  }
+
+
+  //=====================================================================
+  // Returns true iff the file is readable
+  bool ImageReader::CanRead( const std::string& filename ) 
+  {
+    bool ok = false;
+
+       if( !ShallNotRead(filename))
+       {
+               return ok;
+       }
+       if(filename != "")
+       {
+               std::vector<boost::shared_ptr<AbstractImageReader> >::iterator i;
+               for (i=mReader.begin(); i!=mReader.end(); i++)
+               {
+                       ok = (*i)->CanRead(filename);
+                       if (ok) 
+                       {
+                               mLastFilename = filename;
+                               mLastReader = *i;
+                               break;
+                       }
+               }
+       }
+       return ok;
+       
+  }
+  //=====================================================================
+
+  //=====================================================================
+  // Reads the file (CanRead must be called before : no test here)
+  vtkImageData*  ImageReader::ReadImage( const std::string& filename)
+  {
+         if (mLastFilename!=filename)
+      {
+       if (!CanRead(filename))  
+         { 
+           vtkImageData* im = vtkImageData::New();
+           im->ShallowCopy(mUnreadableImage);
+           return im;
+         }
+      }
+    vtkImageData* i = mLastReader->ReadImage(mLastFilename);
+    if (i==0) 
+      {
+       i = vtkImageData::New();
+       i->ShallowCopy(mUnreadableImage);
+      }
+    return i;
+  }
+  //=====================================================================
+
+
+  //=====================================================================
+   void ImageReader::ReadAttributes(const std::string& filename, 
+                                   std::map<std::string,std::string>& attr)
+   {
+    if (mLastFilename!=filename)
+      {
+       if (!CanRead(filename)) 
+         { 
+           return;
+         }
+      }
+    mLastReader->ReadAttributes(mLastFilename,attr);
+   }
+  //=====================================================================
+
+
+  //=====================================================================
+  /// Pushes back all kwown extensions (without dot) in the vector given
+  void ImageReader::PushBackExtensions(std::vector<std::string>& v)
+  {
+         std::vector<boost::shared_ptr<AbstractImageReader> >::iterator i;
+    for (i=mReader.begin(); i!=mReader.end(); i++)
+      {
+       (*i)->PushBackExtensions(v);
+      }
+  }
+  //=====================================================================
+  
+} // namespace creaImageIO