]> Creatis software - creaImageIO.git/blob - src2/creaImageIODicomImageReader2.cpp
75f5f404da24701641bfe16a4d3aab9523b461b5
[creaImageIO.git] / src2 / creaImageIODicomImageReader2.cpp
1 #include <creaImageIODicomImageReader2.h>
2
3
4
5 #include <creaImageIOSystem.h>
6 #include "boost/filesystem/path.hpp"
7
8 #include <creaImageIOTreeAttributeDescriptor.h>
9 #include <vtkStringArray.h>
10 #include <creaImageIOGimmick.h>
11 #ifdef _DEBUG
12 #define new DEBUG_NEW
13 #endif
14 namespace creaImageIO
15 {
16
17   //=====================================================================
18   DicomImageReader::DicomImageReader()
19   {
20           mReader =  vtkGDCMImageReader::New();
21     SetName ( "Dicom" );
22
23   };
24   //=====================================================================
25   
26   //=====================================================================
27   DicomImageReader::~DicomImageReader()
28   {
29           mReader->Delete();
30   }
31   //=====================================================================
32
33   //=====================================================================  
34   bool DicomImageReader::CanRead(const std::string& filename)
35   { 
36           gdcm::Reader reader;
37       reader.SetFileName( filename.c_str() );
38       return  reader.Read();
39          
40   }
41   //=====================================================================
42
43   //=====================================================================
44   vtkImageData* DicomImageReader::ReadImage(const std::string& filename)
45   {
46     vtkImageData* im = 0;
47     try
48       {
49         mReader->SetFileName(filename.c_str());
50         mReader->Update();
51         im = vtkImageData::New();
52         im->ShallowCopy(mReader->GetOutput());
53       }
54     catch (...)
55       {
56         if (im!=0) im->Delete();
57           im = 0;
58       }
59     return im;
60   }
61
62   //=====================================================================
63   void DicomImageReader::PushBackExtensions(std::vector<std::string>& v)
64   {
65     v.push_back("dcm");
66     v.push_back("");
67   }
68   //=====================================================================
69   
70   //========================================================================
71   std::string irclean(const std::string& str)
72   {
73           if(str.size() > 0)
74           {
75                 if (str == "GDCM::Unfound") 
76                   {
77                 return "";
78                   }
79                 if (str[str.size()-1]==' ')
80                   {
81                 return irclean(str.substr(0,str.size()-1));
82                   }
83                 if (str[str.size()-1]==0)
84                   {
85                 return irclean(str.substr(0,str.size()-1));
86                   }
87           }
88     
89     return str;
90   }
91   //========================================================================
92  
93   //=====================================================================
94   void DicomImageReader::ReadAttributes(const std::string& filename, 
95                       std::map<std::string,std::string>& attr)
96   {
97     GimmickMessage(2,"Reading attributes from DICOM file '"
98                    <<filename<<"'"<<std::endl);
99
100    
101          gdcm::Reader reader;
102       reader.SetFileName( filename.c_str() );
103           if (reader.Read())
104       {
105         std::map<std::string,std::string>::iterator i;
106         for (i=attr.begin();i!=attr.end();++i)
107           {
108             if ( i->first == "D0004_1500" )
109               {
110                 boost::filesystem::path full_path(filename);
111                 std::string f = full_path.leaf();
112                 i->second = f;
113               }
114             else if ( i->first == "FullFileName" )
115               {
116                 i->second = filename;
117               }
118                   else if ( i->first == "FullFileDirectory" )
119               {
120                           std::string::size_type last_pos = filename.find_last_of("//");
121                           //find first separator
122                           i->second = filename.substr(0, last_pos);
123               }
124             else
125               {
126                 uint16_t el;
127                 uint16_t gr;
128                 
129                 tree::AttributeDescriptor::GetDicomGroupElementFromKey(i->first,gr,el);
130                 if ( ( gr!=0 ) && ( el!=0 ) )
131                   {
132                            gdcm::DataElement de( gdcm::Tag(gr,el) );
133                            std::string val = GetStringValueFromTag(reader.GetFile().GetHeader().GetDataElement(gdcm::Tag(gr,el)));
134                     i->second = irclean(val);
135                   }
136               }
137           }
138       }
139   }
140
141   const std::string DicomImageReader::GetStringValueFromTag(const gdcm::DataElement& de)
142 {
143   static std::string buffer;
144   buffer = "";  // cleanup previous call
145
146
147     const gdcm::ByteValue *bv = de.GetByteValue();
148     if( bv ) // Can be Type 2
149       {
150       buffer = std::string( bv->GetPointer(), bv->GetLength() );
151       // Will be padded with at least one \0
152       }
153
154
155   // Since return is a const char* the very first \0 will be considered
156   return buffer.c_str();
157 }
158   //=====================================================================
159   
160 } // namespace creaImageIO
161