X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FcreaImageIOImageReader.cpp;h=cdb6cb568c15a3cce4174f2b5522fa94f936d1b7;hb=refs%2Fheads%2Fvtk7itk4;hp=2d34c6638153225f747cd4db12ae5f5eaa3408ad;hpb=f222981341cf668b7bc13eda3faff36444ea0aab;p=creaImageIO.git diff --git a/src/creaImageIOImageReader.cpp b/src/creaImageIOImageReader.cpp index 2d34c66..cdb6cb5 100644 --- a/src/creaImageIOImageReader.cpp +++ b/src/creaImageIOImageReader.cpp @@ -1,8 +1,43 @@ -#include -//#include +/* +# --------------------------------------------------------------------- +# +# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image +# pour la Santé) +# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton +# Previous Authors : Laurent Guigues, Jean-Pierre Roux +# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil +# +# This software is governed by the CeCILL-B license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL-B +# license as circulated by CEA, CNRS and INRIA at the following URL +# http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +# or in the file LICENSE.txt. +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL-B license and that you accept its terms. +# ------------------------------------------------------------------------ +*/ -#include +#include +#include +#include + +#include +#if defined (USE_GDCM) + #include +#endif +#if defined(USE_GDCM2) + #include +#endif +#include #include #include #include @@ -11,354 +46,47 @@ #include //#include -#include -#include - - #include "boost/filesystem/path.hpp" namespace creaImageIO { - - //======================================================================== - std::string irclean(const std::string& str) - { - if (str == "GDCM::Unfound") - { - return "----"; - } - if (str[str.size()-1]==' ') - { - return str.substr(0,str.size()-1); - } - if (str[str.size()-1]==0) - { - return str.substr(0,str.size()-1); - } - - return str; - } - //======================================================================== - - void IRSplitString ( const std::string& str, - const std::string& delimiters, - std::vector& tokens) - { - // Skip delimiters at beginning. - std::string::size_type lastPos = str.find_first_not_of(delimiters, 0); - // Find first delimiter. - std::string::size_type pos = str.find_first_of(delimiters, lastPos); - - while (std::string::npos != pos || std::string::npos != lastPos) - { - // Found a token, add it to the vector. - // SPECIFIC : REMOVE INITIAL DOT (lastPos + 1) - tokens.push_back(str.substr(lastPos+1, pos - lastPos)); - // Skip delimiters. Note the "not_of" - lastPos = str.find_first_not_of(delimiters, pos); - // Find next delimiter - pos = str.find_first_of(delimiters, lastPos); - } - - } - - //===================================================================== - // Static members - /* - std::vector ImageReader::mReader; - std::vectorImageReader::mKnownExtensions; - vtkImageData* ImageReader::mUnreadableImage = 0; - std::string ImageReader::mLastFilename("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"); - SpecificImageReader* ImageReader::mLastReader = 0; - //===================================================================== - // Global instance : automatic init / destr - ImageReader GlobalImageReader; - //===================================================================== - */ - - //===================================================================== - class SpecificImageReader - { - public: - SpecificImageReader() {} - virtual ~SpecificImageReader() {} - void SetName(const std::string& s) { mName = s; } - const std::string& GetName() const { return mName; } - virtual bool CanRead(const std::string& filename) { return false; } - virtual vtkImageData* Read(const std::string& filename) { return 0; } - virtual void PushBackExtensions(std::vector&) {} - virtual void ReadDicomInfo(const std::string& filename, - DicomNode* image) {} - private: - std::string mName; - }; - //===================================================================== - - //===================================================================== - class SpecificVtkReader : public SpecificImageReader - { - public: - SpecificVtkReader(vtkImageReader2* r, - const std::string& name = "", - const std::string& extensions = "") - : mVTKReader(r), mExtensions(extensions) - { - if (name.size() == 0) - { - SetName ( mVTKReader->GetDescriptiveName() ); - } - else - { - SetName ( name ); - } - }; - ~SpecificVtkReader() - { - mVTKReader->Delete(); - } - bool CanRead(const std::string& filename) - { - // std::cout << "## Reader "<CanReadFile(filename.c_str())!=0); - } - vtkImageData* Read(const std::string& filename) - { - // std::cout << "## Reader "<SetFileName(filename.c_str()); - mVTKReader->Update(); - im = vtkImageData::New(); - im->ShallowCopy(mVTKReader->GetOutput()); - } - catch (...) - { - if (im!=0) im->Delete(); - im = 0; - } - return im; - } - - void PushBackExtensions(std::vector& v) - { - std::string ext = mExtensions; - if (ext.size()==0) ext = mVTKReader->GetFileExtensions (); - - IRSplitString(ext," ",v); - } - - void ReadDicomInfo(const std::string& filename, - DicomNode* image) - { - // std::cout << "SpecificVtkReader::ReadDicomInfo '"<SetFieldValue("A0004_1500",irclean(f)); - // Does not work : - // How to get the image info without loading it in vtk ? - - mVTKReader->SetFileName(filename.c_str()); - mVTKReader->Update(); //OpenFile(); - int ext[6]; - mVTKReader->GetDataExtent(ext); - // Columns - char str[128]; - sprintf(str,"%i",ext[1]-ext[0]); - // std::cout << "col="<SetFieldValue("A0028_0011",str); - // Rows - sprintf(str,"%i",ext[3]-ext[2]); - // std::cout << "row="<SetFieldValue("A0028_0010",str); - // Planes == frames - sprintf(str,"%i",ext[5]-ext[4]); - // std::cout << "frames="<SetFieldValue("A0028_0008",str); - - } - private: - vtkImageReader2* mVTKReader; - std::string mExtensions; - }; - //===================================================================== - - //===================================================================== - void IRFillFields(DicomNode* node, - GDCM_NAME_SPACE::File* gdcmFile) - { - const DicomNodeTypeDescription::FieldDescriptionMapType& dm - = node->GetTypeDescription().GetFieldDescriptionMap(); - DicomNodeTypeDescription::FieldDescriptionMapType::const_iterator i; - - - DicomNode::FieldValueMapType& vm = node->GetFieldValueMap(); - for (i=dm.begin(); i!=dm.end(); ++i) - { - if ( (i->second.flags==0) && - (i->second.group!=0) && - (i->second.element!=0) ) - { - uint16_t gr = i->second.group; - uint16_t el = i->second.element; - - std::string val = gdcmFile->GetEntryString(gr,el); - - vm[i->first] = irclean(val); - } - else - { - vm[i->first] = ""; - } - } - } - //===================================================================== - - //===================================================================== - class DicomReader : public SpecificImageReader - { - public: - DicomReader() - { - mReader = vtkGdcmReader::New(); - SetName ( "Dicom" ); - }; - ~DicomReader() - { - mReader->Delete(); - } - bool CanRead(const std::string& filename) - { - // std::cout << "## Reader "<SetLoadMode( GDCM_NAME_SPACE::LD_ALL); - file->SetFileName(filename.c_str()); - file->Load(); - bool ok = file->IsReadable(); - file->Delete(); - return ok; - } - vtkImageData* Read(const std::string& filename) - { - // std::cout << "## Reader "<SetFileName(filename.c_str()); - mReader->Update(); - im = vtkImageData::New(); - im->ShallowCopy(mReader->GetOutput()); - } - catch (...) - { - if (im!=0) im->Delete(); - im = 0; - } - return im; - } - - void PushBackExtensions(std::vector& v) - { - v.push_back("dcm"); - v.push_back(""); - } - - void ReadDicomInfo(const std::string& filename, - DicomNode* image) - { - // std::cout << "DicomReader::ReadDicomInfo '"<SetLoadMode( GDCM_NAME_SPACE::LD_ALL); - file->SetFileName(filename.c_str()); - file->Load(); - if (file->IsReadable()) - { - - DicomNode* cur = image; - do - { - IRFillFields(cur,file); - cur = cur->GetParent(); - } - while (cur); - // File name and full file name - image->SetFieldValue("FullFileName",filename); - - boost::filesystem::path full_path(filename); - - image->SetFieldValue("A0004_1500",full_path.leaf()); - //Utilities::GetFileName(filename)); - } - file->Delete(); - } - - - private: - vtkGdcmReader* mReader; - }; - //===================================================================== - - - - //===================================================================== ImageReader::ImageReader() : mUnreadableImage(0), - mLastFilename("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"), - mLastReader(0) - + mLastFilename("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&") { // std::cout << "#### ImageReader::ImageReader()"<::const_iterator i; - for (i=GetKnownExtensions().begin(); - i!=GetKnownExtensions().end(); - i++) - { - std::cout << "'"<<(*i)<<"'"<(new VtkImageReader(vtkPNGReader::New() , "PNG", ".png"))); + Register(boost::shared_ptr(new VtkImageReader(vtkTIFFReader::New(), "TIFF", ".tiff"))); + Register(boost::shared_ptr(new VtkImageReader(vtkJPEGReader::New(), "JPEG", ".jpeg"))); + Register(boost::shared_ptr(new VtkImageReader(vtkBMPReader::New(), "BMP", ".bmp"))); + Register(boost::shared_ptr(new VtkImageReader(vtkSLCReader::New()))); + Register(boost::shared_ptr(new VtkImageReader(vtkMetaImageReader::New(),"MHD",".mhd"))); + // Register(new VtkImageReader(vtkGESignalReader::New())); + Register(boost::shared_ptr(new DicomImageReader)); + Register(boost::shared_ptr(new UltrasonixImageReader)); + + UnRegister(".txt"); + mUnreadableImage = vtkImageData::New(); int dim[3]; dim[0] = dim[1] = 128; dim[2] = 1; mUnreadableImage->SetDimensions ( dim ); + +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 mUnreadableImage->SetScalarTypeToUnsignedChar(); - mUnreadableImage->AllocateScalars(); + mUnreadableImage->AllocateScalars(); +#else + mUnreadableImage->AllocateScalars(VTK_UNSIGNED_CHAR,1); +#endif + for (int i=0;iSetScalarComponentFromFloat(i,j,0,0,0); @@ -367,24 +95,18 @@ namespace creaImageIO mUnreadableImage->SetScalarComponentFromFloat(i,i,0,0,255); mUnreadableImage->SetScalarComponentFromFloat(dim[0]-1-i,i,0,0,255); } - - - } //===================================================================== //===================================================================== ImageReader::~ImageReader() { - // std::cout << "#### ImageReader::~ImageReader()"<::iterator i; - for (i=mReader.begin(); i!=mReader.end(); i++) - { - // std::cout << "#### ImageReader::UnRegister(" - // << (*i)->GetName()<<")"<Delete(); @@ -394,73 +116,107 @@ namespace creaImageIO //===================================================================== //===================================================================== - void ImageReader::Register(SpecificImageReader* r) + void ImageReader::Register(boost::shared_ptr r) { - // std::cout << "#### ImageReader::Register("<GetName()<<")"<PushBackExtensions(mKnownExtensions); + + } + + void ImageReader::UnRegister(const std::string i_val) + { + mUnReader.push_back(i_val); + } //===================================================================== + //===================================================================== + // Returns true iff the file is readable + bool ImageReader::ShallNotRead( const std::string& filename ) + { + bool ok = true; + if(filename != "") + { + std::vector::iterator i ; + for (i=mUnReader.begin(); i!=mUnReader.end(); i++) + { + + if ( (*i).c_str() == filename) + { + ok = false; + break; + } + } + } + return ok; + } + //===================================================================== // Returns true iff the file is readable - bool ImageReader::CanRead( const std::string& filename, - const std::string& exclude ) + bool ImageReader::CanRead( const std::string& filename ) { - // std::cout << "## ImageReader::CanRead("<::iterator i; - for (i=mReader.begin(); i!=mReader.end(); i++) - { - if ((*i)->GetName()==exclude) continue; - ok = (*i)->CanRead(filename); - if (ok) - { - mLastFilename = filename; - mLastReader = *i; - break; - } - } - return ok; + + if( !ShallNotRead(filename)) + { + return ok; + } + if(filename != "") + { + std::vector >::iterator i; + for (i=mReader.begin(); i!=mReader.end(); i++) + { + ok = (*i)->CanRead(filename); + if (ok) + { + mLastFilename = filename; + mLastReader = *i; + break; + } + } + } + return ok; } //===================================================================== //===================================================================== // Reads the file (CanRead must be called before : no test here) - vtkImageData* ImageReader::Read( const std::string& filename, - const std::string& exclude ) + vtkImageData* ImageReader::ReadImage( const std::string& filename) { - // std::cout << "## ImageReader::Read("<ShallowCopy(mUnreadableImage); return im; } } - vtkImageData* i = mLastReader->Read(mLastFilename); - // std::cout << "i="<ReadImage(mLastFilename); if (i==0) { - // std::cout << "i=UNREAD"<ShallowCopy(mUnreadableImage); } - // std::cout << "i="< &infos, std::vector i_attr) + { + if (mLastFilename!=filename) + { + if (!CanRead(filename)) + { + return; + } + } + mLastReader->getAttributes(filename, infos, i_attr); + } //===================================================================== - void ImageReader::ReadDicomInfo(const std::string& filename, - DicomNode* image) + void ImageReader::ReadAttributes(const std::string& filename, + std::map& attr) { - // std::cout << "ImageReader::ReadDicomInfo '"<ReadDicomInfo(mLastFilename,image); + mLastReader->ReadAttributes(mLastFilename,attr); } //===================================================================== - + //===================================================================== + /// Pushes back all kwown extensions (without dot) in the vector given + void ImageReader::PushBackExtensions(std::vector& v) + { + std::vector >::iterator i; + for (i=mReader.begin(); i!=mReader.end(); i++) + { + (*i)->PushBackExtensions(v); + } + } + //===================================================================== + } // namespace creaImageIO