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