]> Creatis software - creaImageIO.git/blob - src2/creaImageIOImageReader.cpp
*** empty log message ***
[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     std::cout << "## Registered file extensions : "<<std::endl;
51     std::vector<std::string>::const_iterator i;
52     for (i=GetKnownExtensions().begin();
53          i!=GetKnownExtensions().end();
54          i++)
55       {
56         std::cout << "'"<<(*i)<<"'"<<std::endl;
57       }
58     */
59     // 
60     mUnreadableImage = vtkImageData::New();
61     int dim[3];
62     dim[0] = dim[1] = 128; 
63     dim[2] = 1; 
64     mUnreadableImage->SetDimensions ( dim );
65     mUnreadableImage->SetScalarTypeToUnsignedChar();
66     mUnreadableImage->AllocateScalars();    
67     for (int i=0;i<dim[0];i++) 
68       for (int j=0;j<dim[1];j++) 
69         mUnreadableImage->SetScalarComponentFromFloat(i,j,0,0,0);
70     for (int i=0;i<dim[0];i++) 
71       {
72         mUnreadableImage->SetScalarComponentFromFloat(i,i,0,0,255);
73         mUnreadableImage->SetScalarComponentFromFloat(dim[0]-1-i,i,0,0,255);
74       }
75
76
77     
78   }
79   //=====================================================================
80
81   //=====================================================================
82   ImageReader::~ImageReader()
83   {
84     //    std::cout << "#### ImageReader::~ImageReader()"<<std::endl;
85     std::vector<AbstractImageReader*>::iterator i;
86     for (i=mReader.begin(); i!=mReader.end(); i++)
87       {
88         //      std::cout << "#### ImageReader::UnRegister("
89         //                << (*i)->GetName()<<")"<<std::endl;
90         delete (*i);
91       }
92     mReader.clear();
93     if (mUnreadableImage!=0) 
94       {
95         mUnreadableImage->Delete();
96         mUnreadableImage = 0;
97       }
98   }
99   //=====================================================================
100
101   //=====================================================================
102   void ImageReader::Register(AbstractImageReader* r)
103   {
104     //    std::cout << "#### ImageReader::Register("<<r->GetName()<<")"<<std::endl;
105     mReader.push_back(r);
106     //    r->PushBackExtensions(mKnownExtensions);
107   }
108   //=====================================================================
109
110   //=====================================================================
111   // Returns true iff the file is readable
112   bool ImageReader::CanRead( const std::string& filename ) 
113   //                         const std::string& exclude )
114   {
115     //    std::cout << "## ImageReader::CanRead("<<filename<<")"<<std::endl;
116     bool ok = false;
117     std::vector<AbstractImageReader*>::iterator i;
118     for (i=mReader.begin(); i!=mReader.end(); i++)
119       {
120         //      if ((*i)->GetName()==exclude) continue;
121         ok = (*i)->CanRead(filename);
122         if (ok) 
123           {
124             mLastFilename = filename;
125             mLastReader = *i;
126             break;
127           }
128       }
129     return ok;
130   }
131   //=====================================================================
132
133   //=====================================================================
134   // Reads the file (CanRead must be called before : no test here)
135   vtkImageData*  ImageReader::ReadImage( const std::string& filename)
136   //                                     const std::string& exclude )
137   {
138     //    std::cout << "## ImageReader::Read("<<filename<<")"<<std::endl;
139     if (mLastFilename!=filename)
140       {
141         if (!CanRead(filename)) //,exclude)) 
142           { 
143             //      std::cout << "  -- Cannot read image "<<std::endl;
144             vtkImageData* im = vtkImageData::New();
145             im->ShallowCopy(mUnreadableImage);
146             return im;
147           }
148       }
149     vtkImageData* i = mLastReader->ReadImage(mLastFilename);
150     //    std::cout << "i="<<i<<std::endl;
151     if (i==0) 
152       {
153         //      std::cout << "i=UNREAD"<<i<<std::endl;
154         i = vtkImageData::New();
155         i->ShallowCopy(mUnreadableImage);
156       }
157     //    std::cout << "i="<<i<<std::endl;
158     //std::cout<<"return: "<<i->GetScalarTypeAsString()<<", pointer="<<i<<std::endl;
159     return i;
160   }
161   //=====================================================================
162
163
164   //=====================================================================
165    void ImageReader::ReadAttributes(const std::string& filename, 
166                                     std::map<std::string,std::string>& attr)
167    {
168      // std::cout << "ImageReader::ReadDicomInfo '"<<filename<<"'"<<std::endl;
169     //    std::cout << "## ImageReader::Read("<<filename<<")"<<std::endl;
170     if (mLastFilename!=filename)
171       {
172         if (!CanRead(filename)) 
173           { 
174             return;
175           }
176       }
177     mLastReader->ReadAttributes(mLastFilename,attr);
178    }
179   //=====================================================================
180
181
182   //=====================================================================
183   /// Pushes back all kwown extensions (without dot) in the vector given
184   void ImageReader::PushBackExtensions(std::vector<std::string>& v)
185   {
186     std::vector<AbstractImageReader*>::iterator i;
187     for (i=mReader.begin(); i!=mReader.end(); i++)
188       {
189         (*i)->PushBackExtensions(v);
190       }
191   }
192   //=====================================================================
193   
194 } // namespace creaImageIO