1 #include <creaImageIODicomImageReader.h>
3 #include <vtkGdcmReader.h>
4 #include <creaImageIOSystem.h>
5 #include "boost/filesystem/path.hpp"
7 #include <creaImageIOTreeAttributeDescriptor.h>
8 #include <vtkStringArray.h>
13 //=====================================================================
14 DicomImageReader::DicomImageReader()
16 mReader = vtkGdcmReader::New();
19 //=====================================================================
21 //=====================================================================
22 DicomImageReader::~DicomImageReader()
26 //=====================================================================
28 //=====================================================================
29 bool DicomImageReader::CanRead(const std::string& filename)
31 GDCM_NAME_SPACE::Document*doc;
32 GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
33 file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
34 file->SetFileName(filename.c_str());
36 bool ok = file->IsReadable();
39 doc = (GDCM_NAME_SPACE::Document*)file;
40 ok = doc->IsReadable();
45 //=====================================================================
47 //=====================================================================
48 vtkImageData* DicomImageReader::ReadImage(const std::string& filename)
53 mReader->SetFileName(filename.c_str());
55 im = vtkImageData::New();
56 im->ShallowCopy(mReader->GetOutput());
60 if (im!=0) im->Delete();
66 //=====================================================================
67 void DicomImageReader::PushBackExtensions(std::vector<std::string>& v)
72 //=====================================================================
74 //========================================================================
75 std::string irclean(const std::string& str)
79 if (str == "GDCM::Unfound")
83 if (str[str.size()-1]==' ')
85 return str.substr(0,str.size()-1);
87 if (str[str.size()-1]==0)
89 return str.substr(0,str.size()-1);
95 //========================================================================
97 //=====================================================================
98 void DicomImageReader::ReadAttributes(const std::string& filename,
99 std::map<std::string,std::string>& attr)
101 GimmickMessage(2,"Reading attributes from DICOM file '"
102 <<filename<<"'"<<std::endl);
104 //GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
105 boost::shared_ptr<GDCM_NAME_SPACE::File> file(GDCM_NAME_SPACE::File::New(), DicomImageReader::deleter());
107 GDCM_NAME_SPACE::Document *doc= GDCM_NAME_SPACE::File::New();
108 doc->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
109 doc->SetFileName(filename.c_str());
111 file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
112 file->SetFileName(filename.c_str());
114 if (file->IsReadable())// ||((GDCM_NAME_SPACE::Document*) file)->IsReadable())
116 std::map<std::string,std::string>::iterator i;
117 for (i=attr.begin();i!=attr.end();++i)
119 if ( i->first == "D0004_1500" )
121 boost::filesystem::path full_path(filename);
122 std::string f = full_path.leaf();
125 else if ( i->first == "FullFileName" )
127 i->second = filename;
129 else if ( i->first == "FullFileDirectory" )
131 std::string::size_type last_pos = filename.find_last_of("//");
132 //find first separator
133 i->second = filename.substr(0, last_pos);
139 tree::AttributeDescriptor::GetDicomGroupElementFromKey(i->first,gr,el);
140 if ( ( gr!=0 ) && ( el!=0 ) )
142 std::string val = file->GetEntryString(gr,el);
143 i->second = irclean(val);
151 //=====================================================================
153 } // namespace creaImageIO