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>
15 //=====================================================================
16 DicomImageReader::DicomImageReader()
18 mReader = vtkGdcmReader::New();
21 //=====================================================================
23 //=====================================================================
24 DicomImageReader::~DicomImageReader()
28 //=====================================================================
30 //=====================================================================
31 bool DicomImageReader::CanRead(const std::string& filename)
33 GDCM_NAME_SPACE::Document*doc;
34 GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
35 file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
36 file->SetFileName(filename.c_str());
38 bool ok = file->IsReadable();
41 doc = (GDCM_NAME_SPACE::Document*)file;
42 ok = doc->IsReadable();
47 //=====================================================================
49 //=====================================================================
50 vtkImageData* DicomImageReader::ReadImage(const std::string& filename)
55 mReader->SetFileName(filename.c_str());
57 im = vtkImageData::New();
58 im->ShallowCopy(mReader->GetOutput());
62 if (im!=0) im->Delete();
68 //=====================================================================
69 void DicomImageReader::PushBackExtensions(std::vector<std::string>& v)
74 //=====================================================================
76 //========================================================================
77 std::string irclean(const std::string& str)
81 if (str == "GDCM::Unfound")
85 if (str[str.size()-1]==' ')
87 return str.substr(0,str.size()-1);
89 if (str[str.size()-1]==0)
91 return str.substr(0,str.size()-1);
97 //========================================================================
99 //=====================================================================
100 void DicomImageReader::ReadAttributes(const std::string& filename,
101 std::map<std::string,std::string>& attr)
103 GimmickMessage(2,"Reading attributes from DICOM file '"
104 <<filename<<"'"<<std::endl);
106 GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
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());
112 file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
113 file->SetFileName(filename.c_str());
115 if (file->IsReadable() ||((GDCM_NAME_SPACE::Document*) file)->IsReadable())
117 std::map<std::string,std::string>::iterator i;
118 for (i=attr.begin();i!=attr.end();++i)
120 if ( i->first == "D0004_1500" )
122 boost::filesystem::path full_path(filename);
123 std::string f = full_path.leaf();
126 else if ( i->first == "FullFileName" )
128 i->second = filename;
130 else if ( i->first == "FullFileDirectory" )
132 std::string::size_type last_pos = filename.find_last_of("//");
133 //find first separator
134 i->second = filename.substr(0, last_pos);
140 tree::AttributeDescriptor::GetDicomGroupElementFromKey(i->first,gr,el);
141 if ( ( gr!=0 ) && ( el!=0 ) )
143 std::string val = file->GetEntryString(gr,el);
144 i->second = irclean(val);
152 //=====================================================================
154 } // namespace creaImageIO