]> Creatis software - creaImageIO.git/blob - src2/creaImageIOImageReader.cpp
Set GDCM2 library as available DICOM Reader
[creaImageIO.git] / src2 / 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
22 #include "boost/filesystem/path.hpp"
23
24 namespace creaImageIO
25 {
26   
27
28
29
30
31   //=====================================================================
32   ImageReader::ImageReader()
33     :   
34     mUnreadableImage(0),
35     mLastFilename("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&")
36   {
37     //    std::cout << "#### ImageReader::ImageReader()"<<std::endl;
38     if (mUnreadableImage!=0) return;
39         
40         Register( boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkPNGReader::New(), "PNG", ".png")));
41     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkTIFFReader::New(), "JPEG", ".jpeg")));
42     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkJPEGReader::New())));
43     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkBMPReader::New())));
44     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkSLCReader::New())));
45     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkMetaImageReader::New(),"MHD",".mhd")));
46     //   Register(new VtkImageReader(vtkGESignalReader::New()));
47     Register(boost::shared_ptr<AbstractImageReader>(new DicomImageReader));
48     Register(boost::shared_ptr<AbstractImageReader>(new UltrasonixImageReader));
49
50         UnRegister(".txt");
51  
52     mUnreadableImage = vtkImageData::New();
53     int dim[3];
54     dim[0] = dim[1] = 128; 
55     dim[2] = 1; 
56     mUnreadableImage->SetDimensions ( dim );
57     mUnreadableImage->SetScalarTypeToUnsignedChar();
58     mUnreadableImage->AllocateScalars();    
59     for (int i=0;i<dim[0];i++) 
60       for (int j=0;j<dim[1];j++) 
61         mUnreadableImage->SetScalarComponentFromFloat(i,j,0,0,0);
62     for (int i=0;i<dim[0];i++) 
63       {
64         mUnreadableImage->SetScalarComponentFromFloat(i,i,0,0,255);
65         mUnreadableImage->SetScalarComponentFromFloat(dim[0]-1-i,i,0,0,255);
66       }
67
68
69     
70   }
71   //=====================================================================
72
73   //=====================================================================
74   ImageReader::~ImageReader()
75   {
76
77  //   for (i=mReader.begin(); i!=mReader.end(); i++)
78  //     {
79         //delete (*i);
80  //     }
81 //    mReader.clear();
82     if (mUnreadableImage!=0) 
83       {
84         mUnreadableImage->Delete();
85         mUnreadableImage = 0;
86       }
87   }
88   //=====================================================================
89
90   //=====================================================================
91   void ImageReader::Register(boost::shared_ptr<AbstractImageReader> r)
92   {
93     mReader.push_back(r);
94
95   }
96
97   void ImageReader::UnRegister(const std::string i_val)
98   {
99     mUnReader.push_back(i_val);
100
101   }
102   //=====================================================================
103
104    //=====================================================================
105   // Returns true iff the file is readable
106   bool ImageReader::ShallNotRead( const std::string& filename ) 
107   {
108     bool ok = true;
109         if(filename != "")
110         {
111                 std::vector<std::string >::iterator i ;
112                 for (i=mUnReader.begin(); i!=mUnReader.end(); i++)
113                 {
114                         
115                         if ( (*i).c_str() == filename) 
116                         {
117                                 ok = false;
118                                 break;
119                         }
120                 }
121         }
122         return ok;
123         
124   }
125
126
127   //=====================================================================
128   // Returns true iff the file is readable
129   bool ImageReader::CanRead( const std::string& filename ) 
130   {
131     bool ok = false;
132
133         if( !ShallNotRead(filename))
134         {
135                 return ok;
136         }
137         if(filename != "")
138         {
139                 std::vector<boost::shared_ptr<AbstractImageReader> >::iterator i;
140                 for (i=mReader.begin(); i!=mReader.end(); i++)
141                 {
142                         ok = (*i)->CanRead(filename);
143                         if (ok) 
144                         {
145                                 mLastFilename = filename;
146                                 mLastReader = *i;
147                                 break;
148                         }
149                 }
150         }
151         return ok;
152         
153   }
154   //=====================================================================
155
156   //=====================================================================
157   // Reads the file (CanRead must be called before : no test here)
158   vtkImageData*  ImageReader::ReadImage( const std::string& filename)
159   {
160           if (mLastFilename!=filename)
161       {
162         if (!CanRead(filename))  
163           { 
164             vtkImageData* im = vtkImageData::New();
165             im->ShallowCopy(mUnreadableImage);
166             return im;
167           }
168       }
169     vtkImageData* i = mLastReader->ReadImage(mLastFilename);
170     if (i==0) 
171       {
172         i = vtkImageData::New();
173         i->ShallowCopy(mUnreadableImage);
174       }
175     return i;
176   }
177   //=====================================================================
178
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