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