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