Go to the documentation of this file.00001 #include <creaImageIOImageReader.h>
00002 #include <creaImageIOTreeAttributeDescriptor.h>
00003 #include <creaImageIOSystem.h>
00004
00005 #include <creaImageIOVtkImageReader.h>
00006 #if defined (USE_GDCM)
00007 #include <creaImageIODicomImageReader.h>
00008 #endif
00009 #if defined(USE_GDCM2)
00010 #include <creaImageIODicomImageReader2.h>
00011 #endif
00012 #include <creaImageIOUltrasonixImageReader.h>
00013 #include <vtkPNGReader.h>
00014 #include <vtkTIFFReader.h>
00015 #include <vtkJPEGReader.h>
00016 #include <vtkBMPReader.h>
00017 #include <vtkSLCReader.h>
00018 #include <vtkMetaImageReader.h>
00019
00020
00021 #include "boost/filesystem/path.hpp"
00022
00023 namespace creaImageIO
00024 {
00025
00026
00027 ImageReader::ImageReader()
00028 :
00029 mUnreadableImage(0),
00030 mLastFilename("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&")
00031 {
00032
00033 if (mUnreadableImage!=0) return;
00034
00035 Register( boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkPNGReader::New(), "PNG", ".png")));
00036 Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkTIFFReader::New(), "JPEG", ".jpeg")));
00037 Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkJPEGReader::New())));
00038 Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkBMPReader::New())));
00039 Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkSLCReader::New())));
00040 Register(boost::shared_ptr<AbstractImageReader>(new VtkImageReader(vtkMetaImageReader::New(),"MHD",".mhd")));
00041
00042 Register(boost::shared_ptr<AbstractImageReader>(new DicomImageReader));
00043 Register(boost::shared_ptr<AbstractImageReader>(new UltrasonixImageReader));
00044
00045 UnRegister(".txt");
00046
00047 mUnreadableImage = vtkImageData::New();
00048 int dim[3];
00049 dim[0] = dim[1] = 128;
00050 dim[2] = 1;
00051 mUnreadableImage->SetDimensions ( dim );
00052 mUnreadableImage->SetScalarTypeToUnsignedChar();
00053 mUnreadableImage->AllocateScalars();
00054 for (int i=0;i<dim[0];i++)
00055 for (int j=0;j<dim[1];j++)
00056 mUnreadableImage->SetScalarComponentFromFloat(i,j,0,0,0);
00057 for (int i=0;i<dim[0];i++)
00058 {
00059 mUnreadableImage->SetScalarComponentFromFloat(i,i,0,0,255);
00060 mUnreadableImage->SetScalarComponentFromFloat(dim[0]-1-i,i,0,0,255);
00061 }
00062 }
00063
00064
00065
00066 ImageReader::~ImageReader()
00067 {
00068
00069
00070
00071
00072
00073
00074 if (mUnreadableImage!=0)
00075 {
00076 mUnreadableImage->Delete();
00077 mUnreadableImage = 0;
00078 }
00079 }
00080
00081
00082
00083 void ImageReader::Register(boost::shared_ptr<AbstractImageReader> r)
00084 {
00085 mReader.push_back(r);
00086
00087 }
00088
00089 void ImageReader::UnRegister(const std::string i_val)
00090 {
00091 mUnReader.push_back(i_val);
00092
00093 }
00094
00095
00096
00097
00098 bool ImageReader::ShallNotRead( const std::string& filename )
00099 {
00100 bool ok = true;
00101 if(filename != "")
00102 {
00103 std::vector<std::string >::iterator i ;
00104 for (i=mUnReader.begin(); i!=mUnReader.end(); i++)
00105 {
00106
00107 if ( (*i).c_str() == filename)
00108 {
00109 ok = false;
00110 break;
00111 }
00112 }
00113 }
00114 return ok;
00115 }
00116
00117
00118
00119 bool ImageReader::CanRead( const std::string& filename )
00120 {
00121 bool ok = false;
00122
00123 if( !ShallNotRead(filename))
00124 {
00125 return ok;
00126 }
00127 if(filename != "")
00128 {
00129 std::vector<boost::shared_ptr<AbstractImageReader> >::iterator i;
00130 for (i=mReader.begin(); i!=mReader.end(); i++)
00131 {
00132 ok = (*i)->CanRead(filename);
00133 if (ok)
00134 {
00135 mLastFilename = filename;
00136 mLastReader = *i;
00137 break;
00138 }
00139 }
00140 }
00141 return ok;
00142 }
00143
00144
00145
00146
00147 vtkImageData* ImageReader::ReadImage( const std::string& filename)
00148 {
00149 if (mLastFilename!=filename)
00150 {
00151 if (!CanRead(filename))
00152 {
00153 vtkImageData* im = vtkImageData::New();
00154 im->ShallowCopy(mUnreadableImage);
00155 return im;
00156 }
00157 }
00158 vtkImageData* i = mLastReader->ReadImage(mLastFilename);
00159 if (i==0)
00160 {
00161 i = vtkImageData::New();
00162 i->ShallowCopy(mUnreadableImage);
00163 }
00164 return i;
00165 }
00166
00167
00168 void ImageReader::getAttributes(const std::string filename,
00169 std::map <std::string , std::string> &infos, std::vector<std::string> i_attr)
00170 {
00171 if (mLastFilename!=filename)
00172 {
00173 if (!CanRead(filename))
00174 {
00175 return;
00176 }
00177 }
00178 mLastReader->getAttributes(filename, infos, i_attr);
00179 }
00180
00181 void ImageReader::ReadAttributes(const std::string& filename,
00182 std::map<std::string,std::string>& attr)
00183 {
00184 if (mLastFilename!=filename)
00185 {
00186 if (!CanRead(filename))
00187 {
00188 return;
00189 }
00190 }
00191 mLastReader->ReadAttributes(mLastFilename,attr);
00192 }
00193
00194
00195
00196
00198 void ImageReader::PushBackExtensions(std::vector<std::string>& v)
00199 {
00200 std::vector<boost::shared_ptr<AbstractImageReader> >::iterator i;
00201 for (i=mReader.begin(); i!=mReader.end(); i++)
00202 {
00203 (*i)->PushBackExtensions(v);
00204 }
00205 }
00206
00207
00208 }