]> Creatis software - creaImageIO.git/blob - src/creaImageIOImageReader.cpp
#3264 creaImageIO Feature New Normal - Add Dicom Tags to the DB sqlite
[creaImageIO.git] / src / creaImageIOImageReader.cpp
1 /*
2 # ---------------------------------------------------------------------
3 #
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image 
5 #                        pour la Santé)
6 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
9 #
10 #  This software is governed by the CeCILL-B license under French law and 
11 #  abiding by the rules of distribution of free software. You can  use, 
12 #  modify and/ or redistribute the software under the terms of the CeCILL-B 
13 #  license as circulated by CEA, CNRS and INRIA at the following URL 
14 #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
15 #  or in the file LICENSE.txt.
16 #
17 #  As a counterpart to the access to the source code and  rights to copy,
18 #  modify and redistribute granted by the license, users are provided only
19 #  with a limited warranty  and the software's author,  the holder of the
20 #  economic rights,  and the successive licensors  have only  limited
21 #  liability. 
22 #
23 #  The fact that you are presently reading this means that you have had
24 #  knowledge of the CeCILL-B license and that you accept its terms.
25 # ------------------------------------------------------------------------
26 */
27
28
29 #include <creaImageIOImageReader.h>
30 #include <creaImageIOTreeAttributeDescriptor.h>
31 #include <creaImageIOSystem.h>
32
33 #include <creaImageIOVtkImageReader.h>
34 #if defined (USE_GDCM)
35         #include <creaImageIODicomImageReader.h>
36 #endif
37 #if defined(USE_GDCM2)
38         #include <creaImageIODicomImageReader2.h>
39 #endif
40 #include <creaImageIOUltrasonixImageReader.h>
41 #include <vtkPNGReader.h>
42 #include <vtkTIFFReader.h>
43 #include <vtkJPEGReader.h>
44 #include <vtkBMPReader.h>
45 #include <vtkSLCReader.h>
46 #include <vtkMetaImageReader.h>
47 //#include <vtkGESignalReader.h>
48
49 #include "boost/filesystem/path.hpp"
50
51 namespace creaImageIO
52 {
53
54   //=====================================================================
55   ImageReader::ImageReader()
56     :   
57     mUnreadableImage(NULL),
58     mLastFilename("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&")
59   {
60     //    std::cout << "#### ImageReader::ImageReader()"<<std::endl;
61     if (mUnreadableImage!=NULL) return;
62
63
64         Register( boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkPNGReader::New() , "PNG", ".png")));
65     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkTIFFReader::New(), "TIFF", ".tiff")));
66     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkJPEGReader::New(), "JPEG", ".jpeg")));
67     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkBMPReader::New(), "BMP", ".bmp")));
68     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkSLCReader::New())));
69     Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkMetaImageReader::New(),"MHD",".mhd")));
70     //   Register(new VtkImageReader(vtkGESignalReader::New()));
71     Register(boost::shared_ptr<AbstractImageReader>(new DicomImageReader));
72     Register(boost::shared_ptr<AbstractImageReader>(new UltrasonixImageReader));
73
74         UnRegister(".txt");
75  
76     mUnreadableImage = vtkImageData::New();
77     int dim[3];
78     dim[0] = dim[1] = 128; 
79     dim[2] = 1; 
80     mUnreadableImage->SetDimensions ( dim );
81
82 //EED 2017-01-01 Migration VTK7
83 #if VTK_MAJOR_VERSION <= 5
84     mUnreadableImage->SetScalarTypeToUnsignedChar();
85     mUnreadableImage->AllocateScalars();   
86 #else
87     mUnreadableImage->AllocateScalars(VTK_UNSIGNED_CHAR,1);
88 #endif
89  
90     for (int i=0;i<dim[0];i++) 
91         {
92                 for (int j=0;j<dim[1];j++) 
93                 {
94                         mUnreadableImage->SetScalarComponentFromFloat(i,j,0,0,0);
95                 } // for j
96         } // for i
97         
98     for (int i=0;i<dim[0];i++) 
99     {
100                 mUnreadableImage->SetScalarComponentFromFloat(i,i,0,0,255);
101                 mUnreadableImage->SetScalarComponentFromFloat(dim[0]-1-i,i,0,0,255);
102     } // for i
103   }
104   //=====================================================================
105
106   //=====================================================================
107   ImageReader::~ImageReader()
108   {
109
110  //   for (i=mReader.begin(); i!=mReader.end(); i++)
111  //     {
112         //delete (*i);
113  //     }
114 //    mReader.clear();
115     if (mUnreadableImage!=NULL) 
116     {
117                 mUnreadableImage->Delete();
118                 mUnreadableImage = NULL;
119     }
120   }
121   //=====================================================================
122
123   //=====================================================================
124   void ImageReader::Register(boost::shared_ptr<AbstractImageReader> r)
125   {
126     mReader.push_back(r);
127   }
128
129   void ImageReader::UnRegister(const std::string i_val)
130   {
131     mUnReader.push_back(i_val);
132
133   }
134   //=====================================================================
135
136    //=====================================================================
137   // Returns true iff the file is readable
138   bool ImageReader::ShallNotRead( const std::string& filename ) 
139   {
140     bool ok = true;
141         if(filename != "")
142         {
143                 std::vector<std::string >::iterator i ;
144                 for (i=mUnReader.begin(); i!=mUnReader.end(); i++)
145                 {
146                         if ( (*i).c_str() == filename) 
147                         {
148                                 ok = false;
149                                 break;
150                         }
151                 }
152         }
153         return ok;
154   }
155
156   //=====================================================================
157   // Returns true iff the file is readable
158   bool ImageReader::CanRead( const std::string& filename ) 
159   {
160 printf("EED ImageReader::CanRead Start\n");
161
162     bool ok = false;
163
164         if( !ShallNotRead(filename))
165         {
166                 return ok;
167         }
168         if(filename != "")
169         {
170                 std::vector<boost::shared_ptr<AbstractImageReader> >::iterator i;
171                 for (i=mReader.begin(); i!=mReader.end(); i++)
172                 {
173                         ok = (*i)->CanRead(filename);
174                         if (ok) 
175                         {
176                                 mLastFilename = filename;
177                                 mLastReader = *i;
178 printf("EED ImageReader::CanRead %s\n",mLastReader->GetName().c_str());
179                                 break;
180                         }
181                 }
182         }
183 if (ok==true) printf("EED ImageReader::CanRead true End\n");
184 if (ok==false) printf("EED ImageReader::CanRead false End\n");
185         return ok;
186   }
187   //=====================================================================
188
189   //=====================================================================
190   // Reads the file (CanRead must be called before : no test here)
191   vtkImageData*  ImageReader::ReadImage( const std::string& filename)
192   {
193 printf("EED ImageReader::ReadImage Start\n");
194                 if (mLastFilename!=filename)
195                 {
196 printf("EED ImageReader::ReadImage 1\n");
197                         if (!CanRead(filename))  
198                         { 
199 printf("EED ImageReader::ReadImage 2\n");
200                                 vtkImageData* im = vtkImageData::New();
201                                 im->ShallowCopy(mUnreadableImage);
202 printf("EED ImageReader::ReadImage END2\n");
203                                 return im;
204                         } // CanRead
205                 } // for mLastFilename
206 printf("EED ImageReader::ReadImage 3\n");
207                 vtkImageData* i = mLastReader->ReadImage(mLastFilename);
208 printf("EED ImageReader::ReadImage 4\n");
209                 if (i==NULL) 
210                 {
211                         i = vtkImageData::New();
212                         i->ShallowCopy(mUnreadableImage);
213                 } // i
214 printf("EED ImageReader::ReadImage END1\n");
215
216                 return i;
217   }
218   //=====================================================================
219   // Another function to read attributes for a file
220   void ImageReader::getAttributes(const std::string filename,
221                 std::map <std::string , std::string> &infos, std::vector<std::string> i_attr)
222   {
223            if (mLastFilename!=filename)
224       {
225         if (!CanRead(filename)) 
226           { 
227             return;
228           }
229       }
230     mLastReader->getAttributes(filename, infos, i_attr);
231   }
232   //=====================================================================
233    void ImageReader::ReadAttributes(const std::string& filename, 
234                                     std::map<std::string,std::string>& attr)
235    {
236     if (mLastFilename!=filename)
237       {
238         if (!CanRead(filename)) 
239           { 
240             return;
241           }
242       }
243     mLastReader->ReadAttributes(mLastFilename,attr);
244    }
245   //=====================================================================
246
247
248   //=====================================================================
249   /// Pushes back all kwown extensions (without dot) in the vector given
250   void ImageReader::PushBackExtensions(std::vector<std::string>& v)
251   {
252           std::vector<boost::shared_ptr<AbstractImageReader> >::iterator i;
253     for (i=mReader.begin(); i!=mReader.end(); i++)
254       {
255         (*i)->PushBackExtensions(v);
256       }
257   }
258   //=====================================================================
259   
260 } // namespace creaImageIO