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