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