]> Creatis software - creaImageIO.git/blob - src/creaImageIOImageReader.cpp
d93b186c839253fbac7aa11f29e30260c2de2e75
[creaImageIO.git] / src / creaImageIOImageReader.cpp
1 #include <creaImageIOImageReader.h>
2 #include <creaImageIOTreeAttributeDescriptor.h>
3 #include <creaImageIOSystem.h>
4
5 #include <creaImageIOVtkImageReader.h>
6 #if defined (USE_GDCM)
7         #include <creaImageIODicomImageReader.h>
8 #endif
9 #if defined(USE_GDCM2)
10         #include <creaImageIODicomImageReader2.h>
11 #endif
12 #include <creaImageIOUltrasonixImageReader.h>
13 #include <vtkPNGReader.h>
14 #include <vtkTIFFReader.h>
15 #include <vtkJPEGReader.h>
16 #include <vtkBMPReader.h>
17 #include <vtkSLCReader.h>
18 #include <vtkMetaImageReader.h>
19 //#include <vtkGESignalReader.h>
20
21 #include "boost/filesystem/path.hpp"
22
23 namespace creaImageIO
24 {
25
26   //=====================================================================
27   ImageReader::ImageReader()
28     :   
29     mUnreadableImage(0),
30     mLastFilename("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&")
31   {
32     //    std::cout << "#### ImageReader::ImageReader()"<<std::endl;
33     if (mUnreadableImage!=0) return;
34         
35     Register( boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkPNGReader::New(), "PNG", ".png")));
36     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkTIFFReader::New(), "JPEG", ".jpeg")));
37     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkJPEGReader::New())));
38     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkBMPReader::New())));
39     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkSLCReader::New())));
40     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkMetaImageReader::New(),"MHD",".mhd")));
41     //   Register(new VtkImageReader(vtkGESignalReader::New()));
42     Register(boost::shared_ptr<AbstractImageReader>(new DicomImageReader));
43     Register(boost::shared_ptr<AbstractImageReader>(new UltrasonixImageReader));
44
45         UnRegister(".txt");
46  
47     mUnreadableImage = vtkImageData::New();
48     int dim[3];
49     dim[0] = dim[1] = 128; 
50     dim[2] = 1; 
51     mUnreadableImage->SetDimensions ( dim );
52     mUnreadableImage->SetScalarTypeToUnsignedChar();
53     mUnreadableImage->AllocateScalars();    
54     for (int i=0;i<dim[0];i++) 
55       for (int j=0;j<dim[1];j++) 
56         mUnreadableImage->SetScalarComponentFromFloat(i,j,0,0,0);
57     for (int i=0;i<dim[0];i++) 
58       {
59         mUnreadableImage->SetScalarComponentFromFloat(i,i,0,0,255);
60         mUnreadableImage->SetScalarComponentFromFloat(dim[0]-1-i,i,0,0,255);
61       }
62   }
63   //=====================================================================
64
65   //=====================================================================
66   ImageReader::~ImageReader()
67   {
68
69  //   for (i=mReader.begin(); i!=mReader.end(); i++)
70  //     {
71         //delete (*i);
72  //     }
73 //    mReader.clear();
74     if (mUnreadableImage!=0) 
75       {
76         mUnreadableImage->Delete();
77         mUnreadableImage = 0;
78       }
79   }
80   //=====================================================================
81
82   //=====================================================================
83   void ImageReader::Register(boost::shared_ptr<AbstractImageReader> r)
84   {
85     mReader.push_back(r);
86
87   }
88
89   void ImageReader::UnRegister(const std::string i_val)
90   {
91     mUnReader.push_back(i_val);
92
93   }
94   //=====================================================================
95
96    //=====================================================================
97   // Returns true iff the file is readable
98   bool ImageReader::ShallNotRead( const std::string& filename ) 
99   {
100     bool ok = true;
101         if(filename != "")
102         {
103                 std::vector<std::string >::iterator i ;
104                 for (i=mUnReader.begin(); i!=mUnReader.end(); i++)
105                 {
106                         
107                         if ( (*i).c_str() == filename) 
108                         {
109                                 ok = false;
110                                 break;
111                         }
112                 }
113         }
114         return ok;
115   }
116
117   //=====================================================================
118   // Returns true iff the file is readable
119   bool ImageReader::CanRead( const std::string& filename ) 
120   {
121     bool ok = false;
122
123         if( !ShallNotRead(filename))
124         {
125                 return ok;
126         }
127         if(filename != "")
128         {
129                 std::vector<boost::shared_ptr<AbstractImageReader> >::iterator i;
130                 for (i=mReader.begin(); i!=mReader.end(); i++)
131                 {
132                         ok = (*i)->CanRead(filename);
133                         if (ok) 
134                         {
135                                 mLastFilename = filename;
136                                 mLastReader = *i;
137                                 break;
138                         }
139                 }
140         }
141         return ok;
142   }
143   //=====================================================================
144
145   //=====================================================================
146   // Reads the file (CanRead must be called before : no test here)
147   vtkImageData*  ImageReader::ReadImage( const std::string& filename)
148   {
149           if (mLastFilename!=filename)
150       {
151         if (!CanRead(filename))  
152           { 
153             vtkImageData* im = vtkImageData::New();
154             im->ShallowCopy(mUnreadableImage);
155             return im;
156           }
157       }
158     vtkImageData* i = mLastReader->ReadImage(mLastFilename);
159     if (i==0) 
160       {
161         i = vtkImageData::New();
162         i->ShallowCopy(mUnreadableImage);
163       }
164     return i;
165   }
166   //=====================================================================
167   // Another function to read attributes for a file
168   void ImageReader::getAttributes(const std::string filename,
169                 std::map <std::string , std::string> &infos, std::vector<std::string> i_attr)
170   {
171            if (mLastFilename!=filename)
172       {
173         if (!CanRead(filename)) 
174           { 
175             return;
176           }
177       }
178     mLastReader->getAttributes(filename, infos, i_attr);
179   }
180   //=====================================================================
181    void ImageReader::ReadAttributes(const std::string& filename, 
182                                     std::map<std::string,std::string>& attr)
183    {
184     if (mLastFilename!=filename)
185       {
186         if (!CanRead(filename)) 
187           { 
188             return;
189           }
190       }
191     mLastReader->ReadAttributes(mLastFilename,attr);
192    }
193   //=====================================================================
194
195
196   //=====================================================================
197   /// Pushes back all kwown extensions (without dot) in the vector given
198   void ImageReader::PushBackExtensions(std::vector<std::string>& v)
199   {
200           std::vector<boost::shared_ptr<AbstractImageReader> >::iterator i;
201     for (i=mReader.begin(); i!=mReader.end(); i++)
202       {
203         (*i)->PushBackExtensions(v);
204       }
205   }
206   //=====================================================================
207   
208 } // namespace creaImageIO