]> Creatis software - creaImageIO.git/blobdiff - src/creaImageIODicomImageReader.cpp
move directory
[creaImageIO.git] / src / creaImageIODicomImageReader.cpp
diff --git a/src/creaImageIODicomImageReader.cpp b/src/creaImageIODicomImageReader.cpp
new file mode 100644 (file)
index 0000000..05ea3b2
--- /dev/null
@@ -0,0 +1,162 @@
+#include <creaImageIODicomImageReader.h>
+
+#include <vtkGdcmReader.h>
+
+
+
+#include <creaImageIOSystem.h>
+#include "boost/filesystem/path.hpp"
+
+#include <creaImageIOTreeAttributeDescriptor.h>
+#include <vtkStringArray.h>
+#include <creaImageIOGimmick.h>
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+namespace creaImageIO
+{
+
+  //=====================================================================
+  DicomImageReader::DicomImageReader()
+  {
+    mReader = vtkGdcmReader::New();
+//EED  mReader->SetFlipY(false);
+    SetName ( "Dicom" );
+
+  };
+  //=====================================================================
+  
+  //=====================================================================
+  DicomImageReader::~DicomImageReader()
+  {
+    mReader->Delete();
+  }
+  //=====================================================================
+
+  //=====================================================================  
+  bool DicomImageReader::CanRead(const std::string& filename)
+  { 
+    GDCM_NAME_SPACE::Document*doc;
+    GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
+    file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
+    file->SetFileName(filename.c_str());
+    file->Load();
+    bool ok = file->IsReadable();
+       if(!ok)
+       {
+               doc = (GDCM_NAME_SPACE::Document*)file; 
+               ok = doc->IsReadable();
+       }
+    file->Delete();
+    return ok;
+  }
+  //=====================================================================
+
+  //=====================================================================
+  vtkImageData* DicomImageReader::ReadImage(const std::string& filename)
+  {
+    vtkImageData* im = 0;
+    try
+      {
+       mReader->SetFileName(filename.c_str());
+       mReader->Update();
+       im = vtkImageData::New();
+       im->ShallowCopy(mReader->GetOutput());
+      }
+    catch (...)
+      {
+       if (im!=0) im->Delete();
+         im = 0;
+      }
+    return im;
+  }
+
+  //=====================================================================
+  void DicomImageReader::PushBackExtensions(std::vector<std::string>& v)
+  {
+    v.push_back("dcm");
+    v.push_back("");
+  }
+  //=====================================================================
+  
+  //========================================================================
+  std::string irclean(const std::string& str)
+  {
+         if(str.size() > 0)
+         {
+               if (str == "GDCM::Unfound") 
+                 {
+               return "";
+                 }
+               if (str[str.size()-1]==' ')
+                 {
+               return irclean(str.substr(0,str.size()-1));
+                 }
+               if (str[str.size()-1]==0)
+                 {
+               return irclean(str.substr(0,str.size()-1));
+                 }
+         }
+    
+    return str;
+  }
+  //========================================================================
+  //=====================================================================
+  void DicomImageReader::ReadAttributes(const std::string& filename, 
+                     std::map<std::string,std::string>& attr)
+  {
+    GimmickMessage(2,"Reading attributes from DICOM file '"
+                  <<filename<<"'"<<std::endl);
+
+    GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
+       //boost::shared_ptr<GDCM_NAME_SPACE::File> file(GDCM_NAME_SPACE::File::New());//, DicomImageReader::deleter());
+
+    GDCM_NAME_SPACE::Document *doc= GDCM_NAME_SPACE::File::New();
+    doc->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
+    doc->SetFileName(filename.c_str());
+    doc->Load();
+    file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
+    file->SetFileName(filename.c_str());
+    file->Load();
+    if (file->IsReadable())// ||((GDCM_NAME_SPACE::Document*) file)->IsReadable())
+      {
+       std::map<std::string,std::string>::iterator i;
+       for (i=attr.begin();i!=attr.end();++i)
+         {
+           if ( i->first == "D0004_1500" )
+             {
+               boost::filesystem::path full_path(filename);
+               std::string f = full_path.leaf();
+               i->second = f;
+             }
+           else if ( i->first == "FullFileName" )
+             {
+               i->second = filename;
+             }
+                 else if ( i->first == "FullFileDirectory" )
+             {
+                         std::string::size_type last_pos = filename.find_last_of("//");
+                         //find first separator
+                         i->second = filename.substr(0, last_pos);
+             }
+           else
+             {
+               uint16_t el;
+               uint16_t gr;
+               
+               tree::AttributeDescriptor::GetDicomGroupElementFromKey(i->first,gr,el);
+               if ( ( gr!=0 ) && ( el!=0 ) )
+                 {
+                   std::string val =  file->GetEntryString(gr,el);
+                   i->second = irclean(val);
+                 }
+             }
+         }
+      }
+  }
+
+  //=====================================================================
+  
+} // namespace creaImageIO
+