creaImageIOImageReader.cpp

Go to the documentation of this file.
00001 #include <creaImageIOImageReader.h>
00002 #include <creaImageIOTreeAttributeDescriptor.h>
00003 #include <creaImageIOSystem.h>
00004 
00005 #include <creaImageIOVtkImageReader.h>
00006 #if defined (USE_GDCM)
00007         #include <creaImageIODicomImageReader.h>
00008 #endif
00009 #if defined(USE_GDCM2)
00010         #include <creaImageIODicomImageReader2.h>
00011 #endif
00012 #include <creaImageIOUltrasonixImageReader.h>
00013 #include <vtkPNGReader.h>
00014 #include <vtkTIFFReader.h>
00015 #include <vtkJPEGReader.h>
00016 #include <vtkBMPReader.h>
00017 #include <vtkSLCReader.h>
00018 #include <vtkMetaImageReader.h>
00019 //#include <vtkGESignalReader.h>
00020 
00021 #include "boost/filesystem/path.hpp"
00022 
00023 namespace creaImageIO
00024 {
00025 
00026   //=====================================================================
00027   ImageReader::ImageReader()
00028     :   
00029     mUnreadableImage(0),
00030     mLastFilename("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&")
00031   {
00032     //    std::cout << "#### ImageReader::ImageReader()"<<std::endl;
00033     if (mUnreadableImage!=0) return;
00034         
00035     Register( boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkPNGReader::New(), "PNG", ".png")));
00036     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkTIFFReader::New(), "JPEG", ".jpeg")));
00037     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkJPEGReader::New())));
00038     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkBMPReader::New())));
00039     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkSLCReader::New())));
00040     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkMetaImageReader::New(),"MHD",".mhd")));
00041     //   Register(new VtkImageReader(vtkGESignalReader::New()));
00042     Register(boost::shared_ptr<AbstractImageReader>(new DicomImageReader));
00043     Register(boost::shared_ptr<AbstractImageReader>(new UltrasonixImageReader));
00044 
00045         UnRegister(".txt");
00046  
00047     mUnreadableImage = vtkImageData::New();
00048     int dim[3];
00049     dim[0] = dim[1] = 128; 
00050     dim[2] = 1; 
00051     mUnreadableImage->SetDimensions ( dim );
00052     mUnreadableImage->SetScalarTypeToUnsignedChar();
00053     mUnreadableImage->AllocateScalars();    
00054     for (int i=0;i<dim[0];i++) 
00055       for (int j=0;j<dim[1];j++) 
00056         mUnreadableImage->SetScalarComponentFromFloat(i,j,0,0,0);
00057     for (int i=0;i<dim[0];i++) 
00058       {
00059         mUnreadableImage->SetScalarComponentFromFloat(i,i,0,0,255);
00060         mUnreadableImage->SetScalarComponentFromFloat(dim[0]-1-i,i,0,0,255);
00061       }
00062   }
00063   //=====================================================================
00064 
00065   //=====================================================================
00066   ImageReader::~ImageReader()
00067   {
00068 
00069  //   for (i=mReader.begin(); i!=mReader.end(); i++)
00070  //     {
00071         //delete (*i);
00072  //     }
00073 //    mReader.clear();
00074     if (mUnreadableImage!=0) 
00075       {
00076         mUnreadableImage->Delete();
00077         mUnreadableImage = 0;
00078       }
00079   }
00080   //=====================================================================
00081 
00082   //=====================================================================
00083   void ImageReader::Register(boost::shared_ptr<AbstractImageReader> r)
00084   {
00085     mReader.push_back(r);
00086 
00087   }
00088 
00089   void ImageReader::UnRegister(const std::string i_val)
00090   {
00091     mUnReader.push_back(i_val);
00092 
00093   }
00094   //=====================================================================
00095 
00096    //=====================================================================
00097   // Returns true iff the file is readable
00098   bool ImageReader::ShallNotRead( const std::string& filename ) 
00099   {
00100     bool ok = true;
00101         if(filename != "")
00102         {
00103                 std::vector<std::string >::iterator i ;
00104                 for (i=mUnReader.begin(); i!=mUnReader.end(); i++)
00105                 {
00106                         
00107                         if ( (*i).c_str() == filename) 
00108                         {
00109                                 ok = false;
00110                                 break;
00111                         }
00112                 }
00113         }
00114         return ok;
00115   }
00116 
00117   //=====================================================================
00118   // Returns true iff the file is readable
00119   bool ImageReader::CanRead( const std::string& filename ) 
00120   {
00121     bool ok = false;
00122 
00123         if( !ShallNotRead(filename))
00124         {
00125                 return ok;
00126         }
00127         if(filename != "")
00128         {
00129                 std::vector<boost::shared_ptr<AbstractImageReader> >::iterator i;
00130                 for (i=mReader.begin(); i!=mReader.end(); i++)
00131                 {
00132                         ok = (*i)->CanRead(filename);
00133                         if (ok) 
00134                         {
00135                                 mLastFilename = filename;
00136                                 mLastReader = *i;
00137                                 break;
00138                         }
00139                 }
00140         }
00141         return ok;
00142   }
00143   //=====================================================================
00144 
00145   //=====================================================================
00146   // Reads the file (CanRead must be called before : no test here)
00147   vtkImageData*  ImageReader::ReadImage( const std::string& filename)
00148   {
00149           if (mLastFilename!=filename)
00150       {
00151         if (!CanRead(filename))  
00152           { 
00153             vtkImageData* im = vtkImageData::New();
00154             im->ShallowCopy(mUnreadableImage);
00155             return im;
00156           }
00157       }
00158     vtkImageData* i = mLastReader->ReadImage(mLastFilename);
00159     if (i==0) 
00160       {
00161         i = vtkImageData::New();
00162         i->ShallowCopy(mUnreadableImage);
00163       }
00164     return i;
00165   }
00166   //=====================================================================
00167   // Another function to read attributes for a file
00168   void ImageReader::getAttributes(const std::string filename,
00169                 std::map <std::string , std::string> &infos, std::vector<std::string> i_attr)
00170   {
00171            if (mLastFilename!=filename)
00172       {
00173         if (!CanRead(filename)) 
00174           { 
00175             return;
00176           }
00177       }
00178     mLastReader->getAttributes(filename, infos, i_attr);
00179   }
00180   //=====================================================================
00181    void ImageReader::ReadAttributes(const std::string& filename, 
00182                                     std::map<std::string,std::string>& attr)
00183    {
00184     if (mLastFilename!=filename)
00185       {
00186         if (!CanRead(filename)) 
00187           { 
00188             return;
00189           }
00190       }
00191     mLastReader->ReadAttributes(mLastFilename,attr);
00192    }
00193   //=====================================================================
00194 
00195 
00196   //=====================================================================
00198   void ImageReader::PushBackExtensions(std::vector<std::string>& v)
00199   {
00200           std::vector<boost::shared_ptr<AbstractImageReader> >::iterator i;
00201     for (i=mReader.begin(); i!=mReader.end(); i++)
00202       {
00203         (*i)->PushBackExtensions(v);
00204       }
00205   }
00206   //=====================================================================
00207   
00208 } // namespace creaImageIO