]> Creatis software - creaImageIO.git/blobdiff - src/creaImageIOImageReader.cpp
#3185 creaImageIO Feature New Normal - Clean code
[creaImageIO.git] / src / creaImageIOImageReader.cpp
index 970178d0bc16a4fd00afd42e1d3ee07bda6f8c66..4220fb1f85c7371f809f015b087c49b1e2b7f005 100644 (file)
@@ -1,8 +1,43 @@
-#include <creaImageIOImageReader.h>
-//#include <creaImageIOUtilities.h>
+/*
+# ---------------------------------------------------------------------
+#
+# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image 
+#                        pour la Santé)
+# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+# Previous Authors : Laurent Guigues, Jean-Pierre Roux
+# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+#
+#  This software is governed by the CeCILL-B license under French law and 
+#  abiding by the rules of distribution of free software. You can  use, 
+#  modify and/ or redistribute the software under the terms of the CeCILL-B 
+#  license as circulated by CEA, CNRS and INRIA at the following URL 
+#  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
+#  or in the file LICENSE.txt.
+#
+#  As a counterpart to the access to the source code and  rights to copy,
+#  modify and redistribute granted by the license, users are provided only
+#  with a limited warranty  and the software's author,  the holder of the
+#  economic rights,  and the successive licensors  have only  limited
+#  liability. 
+#
+#  The fact that you are presently reading this means that you have had
+#  knowledge of the CeCILL-B license and that you accept its terms.
+# ------------------------------------------------------------------------
+*/
 
 
-#include <vtkImageReader2.h>
+#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 <vtkMetaImageReader.h>
 //#include <vtkGESignalReader.h>
 
-#include <gdcmFile.h> 
-#include <vtkGdcmReader.h>
-
-
 #include "boost/filesystem/path.hpp"
 
 namespace creaImageIO
 {
-  
-  //========================================================================
-  std::string irclean(const std::string& str)
-  {
-    if (str == "GDCM::Unfound") 
-      {
-       return "----";
-      }
-    if (str[str.size()-1]==' ')
-      {
-       return str.substr(0,str.size()-1);
-      }
-    if (str[str.size()-1]==0)
-      {
-       return str.substr(0,str.size()-1);
-      }
-    
-    return str;
-  }
-  //========================================================================
-
-  void IRSplitString ( const std::string& str, 
-                      const std::string& delimiters, 
-                      std::vector<std::string>& tokens)
-  {
-    // Skip delimiters at beginning.
-    std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
-    // Find first delimiter.
-    std::string::size_type pos     = str.find_first_of(delimiters, lastPos);
-    
-    while (std::string::npos != pos || std::string::npos != lastPos)
-      {
-       // Found a token, add it to the vector.
-       // SPECIFIC : REMOVE INITIAL DOT (lastPos + 1)
-       tokens.push_back(str.substr(lastPos+1, pos - lastPos));
-       // Skip delimiters.  Note the "not_of"
-       lastPos = str.find_first_not_of(delimiters, pos);
-       // Find next delimiter
-       pos = str.find_first_of(delimiters, lastPos);
-      }
-    
-    }
-  
-  //=====================================================================
-  // Static members
-  /*
-  std::vector<SpecificImageReader*> ImageReader::mReader;
-  std::vector<std::string>ImageReader::mKnownExtensions;
-  vtkImageData* ImageReader::mUnreadableImage = 0;
-  std::string ImageReader::mLastFilename("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
-  SpecificImageReader* ImageReader::mLastReader = 0;
-  //=====================================================================  
-  // Global instance : automatic init / destr
-  ImageReader GlobalImageReader;
-  //=====================================================================  
-  */
-
-  //=====================================================================
-  class SpecificImageReader 
-  {
-  public:
-    SpecificImageReader() {}
-    virtual ~SpecificImageReader() {}
-    void SetName(const std::string& s) { mName = s; }
-    const std::string& GetName() const { return mName; }
-    virtual bool CanRead(const std::string& filename) { return false; }
-    virtual vtkImageData* Read(const std::string& filename) { return 0; }
-    virtual void PushBackExtensions(std::vector<std::string>&) {}
-    virtual void ReadDicomInfo(const std::string& filename, 
-                              DicomNode* image) {}
-  private:
-    std::string mName;
-  };
-  //=====================================================================
-  
-  //=====================================================================
-  class SpecificVtkReader : public SpecificImageReader         
-  {                                                                    
-  public:                                                              
-    SpecificVtkReader(vtkImageReader2* r, 
-                     const std::string& name = "",
-                     const std::string& extensions = "")
-      : mVTKReader(r), mExtensions(extensions)
-    {
-      if (name.size() == 0) 
-       {
-         SetName ( mVTKReader->GetDescriptiveName() );
-       }
-      else 
-       {
-         SetName ( name );
-       }
-    };
-    ~SpecificVtkReader()
-    {
-      mVTKReader->Delete();
-    }
-    bool CanRead(const std::string& filename)
-    { 
-      //      std::cout << "## Reader "<<GetName()
-      //<<" ::CanRead("<<filename<<")"
-      //               <<std::endl;
-      return (mVTKReader->CanReadFile(filename.c_str())!=0);
-    }
-    vtkImageData* Read(const std::string& filename)
-    {
-      //      std::cout << "## Reader "<<GetName()
-      //<<" ::Read("<<filename<<")"
-      //               <<std::endl;
-      vtkImageData* im = 0;
-      try
-       {
-         mVTKReader->SetFileName(filename.c_str());
-         mVTKReader->Update();
-         im = vtkImageData::New();
-         im->ShallowCopy(mVTKReader->GetOutput());
-       }
-      catch (...)
-       {
-         if (im!=0) im->Delete();
-         im = 0;
-       }
-      return im;
-    }
-
-    void PushBackExtensions(std::vector<std::string>& v)
-    {
-      std::string ext = mExtensions;
-      if (ext.size()==0) ext = mVTKReader->GetFileExtensions ();
-      
-      IRSplitString(ext," ",v);
-    }
-    
-    void ReadDicomInfo(const std::string& filename, 
-                      DicomNode* image) 
-    {
-      boost::filesystem::path full_path(filename);
-      std::string f = full_path.leaf();
-       //Utilities::GetFileName(filename));
-      // file name 
-      image->SetFieldValue("A0004_1500",irclean(f));
-      // Does not work : 
-      // How to get the image info without loading it in vtk ?
-      /*
-      mVTKReader->SetFileName(filename.c_str());
-      mVTKReader->OpenFile();
-      int ext[6];
-      mVTKReader->GetDataExtent(ext);
-      // Columns
-      char str[128];
-      sprintf(str,"%i",ext[1]-ext[0]);
-      image->SetFieldValue("A0028_0011",str);
-      // Rows
-      sprintf(str,"%i",ext[3]-ext[2]);
-      image->SetFieldValue("A0028_0010",str);
-      */
-      
-    }
-  private:
-    vtkImageReader2* mVTKReader;
-    std::string mExtensions;
-  };
-  //=====================================================================
-  //===================================================================== 
-  void IRFillFields(DicomNode* node, 
-                 GDCM_NAME_SPACE::File* gdcmFile)
-  {
-    const DicomNodeTypeDescription::FieldDescriptionMapType& dm
-      = node->GetTypeDescription().GetFieldDescriptionMap();
-    DicomNodeTypeDescription::FieldDescriptionMapType::const_iterator i;
-    
-       
-    DicomNode::FieldValueMapType& vm = node->GetFieldValueMap();
-    for (i=dm.begin(); i!=dm.end(); ++i)
-      {
-       if ( (i->second.flags==0) && 
-            (i->second.group!=0) && 
-            (i->second.element!=0) )
-         {
-               uint16_t gr = i->second.group;
-               uint16_t el = i->second.element;
-
-               std::string val = gdcmFile->GetEntryString(gr,el);
-
-           vm[i->first] = irclean(val);
-         }
-       else 
-         {
-           vm[i->first] = "";
-         }
-      }
-  }
-  //=====================================================================
-
-  //=====================================================================
-  class DicomReader : public SpecificImageReader               
-  {                                                                    
-  public:                                                              
-    DicomReader()
-    {
-      mReader = vtkGdcmReader::New();
-      SetName ( "Dicom" );
-    };
-    ~DicomReader()
-    {
-      mReader->Delete();
-    }
-    bool CanRead(const std::string& filename)
-    { 
-      //      std::cout << "## Reader "<<GetName()
-      //<<" ::CanRead("<<filename<<")"
-      //               <<std::endl;
-      //      return true;
-
-      
-      //      GDCM_NAME_SPACE
-      //  std::cout << "GDCM_NAME_SPACE = '" << STRINGIFY_SYMBOL(GDCM_NAME_SPACE)
-      // << "'" 
-      // <<std::endl;
-      
-      GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
-      file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
-      file->SetFileName(filename.c_str());
-      file->Load();
-      bool ok = file->IsReadable();
-      file->Delete();
-      return ok;
-    }
-    vtkImageData* Read(const std::string& filename)
-    {
-      //      std::cout << "## Reader "<<GetName()
-      //<<" ::Read("<<filename<<")"
-      //               <<std::endl;
-
-      vtkImageData* im = 0;
-      try
-       {
-         mReader->SetFileName(filename.c_str());
-         mReader->Update();
-         im = vtkImageData::New();
-         im->ShallowCopy(mReader->GetOutput());
-       }
-      catch (...)
-       {
-         if (im!=0) im->Delete();
-         im = 0;
-       }
-      return im;
-    }
-
-    void PushBackExtensions(std::vector<std::string>& v)
-    {
-      v.push_back("dcm");
-      v.push_back("");
-    }
-
-    void ReadDicomInfo(const std::string& filename,
-                      DicomNode* image)
-    { 
-      GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
-      file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
-      file->SetFileName(filename.c_str());
-      file->Load();
-      if (file->IsReadable())
-       {
-         
-         DicomNode* cur = image;
-         do 
-           {
-             IRFillFields(cur,file);
-             cur = cur->GetParent();
-           }
-         while (cur);
-         // File name and full file name
-         image->SetFieldValue("FullFileName",filename);
-         
-         boost::filesystem::path full_path(filename);
-         
-         image->SetFieldValue("A0004_1500",full_path.leaf());
-                              //Utilities::GetFileName(filename));
-       }
-      file->Delete();
-    }
-  
-
-  private:
-    vtkGdcmReader* mReader;
-  };
-  //=====================================================================
-
-
-
 
   //=====================================================================
   ImageReader::ImageReader()
     :   
     mUnreadableImage(0),
-    mLastFilename("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"),
-    mLastReader(0)
-
+    mLastFilename("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&")
   {
     //    std::cout << "#### ImageReader::ImageReader()"<<std::endl;
     if (mUnreadableImage!=0) return;
 
-    Register(new SpecificVtkReader(vtkPNGReader::New()));
-    Register(new SpecificVtkReader(vtkTIFFReader::New()));
-    Register(new SpecificVtkReader(vtkJPEGReader::New()));
-    Register(new SpecificVtkReader(vtkBMPReader::New()));
-    Register(new SpecificVtkReader(vtkSLCReader::New()));
-    Register(new SpecificVtkReader(vtkMetaImageReader::New(),"MHD",".mhd"));
-    //   Register(new SpecificVtkReader(vtkGESignalReader::New()));
-    Register(new DicomReader);
 
-    /*
-    std::cout << "## Registered file extensions : "<<std::endl;
-    std::vector<std::string>::const_iterator i;
-    for (i=GetKnownExtensions().begin();
-        i!=GetKnownExtensions().end();
-        i++)
-      {
-       std::cout << "'"<<(*i)<<"'"<<std::endl;
-      }
-    */
-    // 
+       Register( boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkPNGReader::New() , "PNG", ".png")));
+    Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkTIFFReader::New(), "TIFF", ".tiff")));
+    Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkJPEGReader::New(), "JPEG", ".jpeg")));
+    Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkBMPReader::New(), "BMP", ".bmp")));
+    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] = 32
+    dim[0] = dim[1] = 128
     dim[2] = 1; 
     mUnreadableImage->SetDimensions ( dim );
     mUnreadableImage->SetScalarTypeToUnsignedChar();
@@ -360,24 +88,18 @@ namespace creaImageIO
        mUnreadableImage->SetScalarComponentFromFloat(i,i,0,0,255);
        mUnreadableImage->SetScalarComponentFromFloat(dim[0]-1-i,i,0,0,255);
       }
-
-
-    
   }
   //=====================================================================
 
   //=====================================================================
   ImageReader::~ImageReader()
   {
-    //    std::cout << "#### ImageReader::~ImageReader()"<<std::endl;
-    std::vector<SpecificImageReader*>::iterator i;
-    for (i=mReader.begin(); i!=mReader.end(); i++)
-      {
-       //      std::cout << "#### ImageReader::UnRegister("
-       //                << (*i)->GetName()<<")"<<std::endl;
-       delete (*i);
-      }
-    mReader.clear();
+
+ //   for (i=mReader.begin(); i!=mReader.end(); i++)
+ //     {
+       //delete (*i);
+ //     }
+//    mReader.clear();
     if (mUnreadableImage!=0) 
       {
        mUnreadableImage->Delete();
@@ -387,72 +109,107 @@ namespace creaImageIO
   //=====================================================================
 
   //=====================================================================
-  void ImageReader::Register(SpecificImageReader* r)
+  void ImageReader::Register(boost::shared_ptr<AbstractImageReader> r)
   {
-    //    std::cout << "#### ImageReader::Register("<<r->GetName()<<")"<<std::endl;
     mReader.push_back(r);
-    r->PushBackExtensions(mKnownExtensions);
+
+  }
+
+  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, 
-                            const std::string& exclude )
+  bool ImageReader::CanRead( const std::string& filename ) 
   {
-    //    std::cout << "## ImageReader::CanRead("<<filename<<")"<<std::endl;
     bool ok = false;
-    std::vector<SpecificImageReader*>::iterator i;
-    for (i=mReader.begin(); i!=mReader.end(); i++)
-      {
-       if ((*i)->GetName()==exclude) continue;
-       ok = (*i)->CanRead(filename);
-       if (ok) 
-         {
-           mLastFilename = filename;
-           mLastReader = *i;
-           break;
-         }
-      }
-    return ok;
+
+       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::Read( const std::string& filename, 
-                                   const std::string& exclude )
+  vtkImageData*  ImageReader::ReadImage( const std::string& filename)
   {
-    //    std::cout << "## ImageReader::Read("<<filename<<")"<<std::endl;
-    if (mLastFilename!=filename)
+         if (mLastFilename!=filename)
       {
-       if (!CanRead(filename,exclude)) 
+       if (!CanRead(filename))  
          { 
-           //      std::cout << "  -- Cannot read image "<<std::endl;
            vtkImageData* im = vtkImageData::New();
            im->ShallowCopy(mUnreadableImage);
            return im;
          }
       }
-    vtkImageData* i = mLastReader->Read(mLastFilename);
-    //    std::cout << "i="<<i<<std::endl;
+    vtkImageData* i = mLastReader->ReadImage(mLastFilename);
     if (i==0) 
       {
-       //      std::cout << "i=UNREAD"<<i<<std::endl;
        i = vtkImageData::New();
        i->ShallowCopy(mUnreadableImage);
       }
-    //    std::cout << "i="<<i<<std::endl;
     return i;
   }
   //=====================================================================
-
-
+  // Another function to read attributes for a file
+  void ImageReader::getAttributes(const std::string filename,
+               std::map <std::string , std::string> &infos, std::vector<std::string> i_attr)
+  {
+          if (mLastFilename!=filename)
+      {
+       if (!CanRead(filename)) 
+         { 
+           return;
+         }
+      }
+    mLastReader->getAttributes(filename, infos, i_attr);
+  }
   //=====================================================================
-   void ImageReader::ReadDicomInfo(const std::string& filename, 
-                                  DicomNode* image)
+   void ImageReader::ReadAttributes(const std::string& filename, 
+                                   std::map<std::string,std::string>& attr)
    {
-    //    std::cout << "## ImageReader::Read("<<filename<<")"<<std::endl;
     if (mLastFilename!=filename)
       {
        if (!CanRead(filename)) 
@@ -460,10 +217,21 @@ namespace creaImageIO
            return;
          }
       }
-    mLastReader->ReadDicomInfo(mLastFilename,image);
+    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