1 #include <creaImageIODicomImageReader.h>
3 #include <vtkGdcmReader.h>
7 #include <creaImageIOSystem.h>
8 #include "boost/filesystem/path.hpp"
10 #include <creaImageIOTreeAttributeDescriptor.h>
11 #include <vtkStringArray.h>
12 #include <creaImageIOGimmick.h>
19 //=====================================================================
20 DicomImageReader::DicomImageReader()
22 mReader = vtkGdcmReader::New();
24 //EED 21 mars 2012 FLIP probleme ..PLOP..
25 mReader->SetFlipY(false);
30 //=====================================================================
32 //=====================================================================
33 DicomImageReader::~DicomImageReader()
37 //=====================================================================
39 //=====================================================================
40 bool DicomImageReader::CanRead(const std::string& filename)
42 GDCM_NAME_SPACE::Document*doc;
43 GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
44 file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
45 file->SetFileName(filename.c_str());
47 bool ok = file->IsReadable();
50 doc = (GDCM_NAME_SPACE::Document*)file;
51 ok = doc->IsReadable();
56 //=====================================================================
58 //=====================================================================
59 vtkImageData* DicomImageReader::ReadImage(const std::string& filename)
64 mReader->SetFileName(filename.c_str());
66 im = vtkImageData::New();
67 im->ShallowCopy(mReader->GetOutput());
71 if (im!=0) im->Delete();
77 //=====================================================================
78 void DicomImageReader::PushBackExtensions(std::vector<std::string>& v)
83 //=====================================================================
85 //========================================================================
86 std::string irclean(const std::string& str)
90 if (str == "GDCM::Unfound")
94 if (str[str.size()-1]==' ')
96 return irclean(str.substr(0,str.size()-1));
98 if (str[str.size()-1]==0)
100 return irclean(str.substr(0,str.size()-1));
106 //========================================================================
107 void DicomImageReader::getAttributes(const std::string filename,
108 std::map <std::string , std::string> &infos, std::vector<std::string> i_attr)
110 std::vector<std::string>::iterator it = i_attr.begin();
111 for(; it != i_attr.end(); it++)
115 ReadAttributes(filename, infos);
117 //=====================================================================
118 void DicomImageReader::ReadAttributes(const std::string& filename,
119 std::map<std::string,std::string>& attr)
121 GimmickMessage(2,"Reading attributes from DICOM file '"
122 <<filename<<"'"<<std::endl);
124 GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
125 //boost::shared_ptr<GDCM_NAME_SPACE::File> file(GDCM_NAME_SPACE::File::New());//, DicomImageReader::deleter());
127 GDCM_NAME_SPACE::Document *doc= GDCM_NAME_SPACE::File::New();
128 doc->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
129 doc->SetFileName(filename.c_str());
131 file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
132 file->SetFileName(filename.c_str());
134 if (file->IsReadable())// ||((GDCM_NAME_SPACE::Document*) file)->IsReadable())
136 std::map<std::string,std::string>::iterator i;
137 for (i=attr.begin();i!=attr.end();++i)
139 if ( i->first == "D0004_1500" )
141 boost::filesystem::path full_path(filename);
142 std::string f = full_path.leaf();
145 else if ( i->first == "FullFileName" )
147 i->second = filename;
149 else if ( i->first == "FullFileDirectory" )
151 std::string::size_type last_pos = filename.find_last_of("//");
152 //find first separator
153 i->second = filename.substr(0, last_pos);
160 tree::AttributeDescriptor::GetDicomGroupElementFromKey(i->first,gr,el);
161 if ( ( gr!=0 ) && ( el!=0 ) )
163 std::string val = file->GetEntryString(gr,el);
164 i->second = irclean(val);
171 //=====================================================================
173 } // namespace creaImageIO