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