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