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