#include #include #include #include "boost/filesystem/path.hpp" #include #include #include #ifdef _DEBUG #define new DEBUG_NEW #endif namespace creaImageIO { //===================================================================== DicomImageReader::DicomImageReader() { mReader = vtkGdcmReader::New(); //EED 21 mars 2012 FLIP probleme ..PLOP.. mReader->SetFlipY(false); SetName ( "Dicom" ); }; //===================================================================== //===================================================================== DicomImageReader::~DicomImageReader() { mReader->Delete(); } //===================================================================== //===================================================================== bool DicomImageReader::CanRead(const std::string& filename) { GDCM_NAME_SPACE::Document*doc; GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New(); file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL); file->SetFileName(filename.c_str()); file->Load(); bool ok = file->IsReadable(); if(!ok) { doc = (GDCM_NAME_SPACE::Document*)file; ok = doc->IsReadable(); } file->Delete(); return ok; } //===================================================================== //===================================================================== vtkImageData* DicomImageReader::ReadImage(const std::string& filename) { vtkImageData* im = 0; try { mReader->SetFileName(filename.c_str()); mReader->Update(); im = vtkImageData::New(); im->ShallowCopy(mReader->GetOutput()); } catch (...) { if (im!=0) im->Delete(); im = 0; } return im; } //===================================================================== void DicomImageReader::PushBackExtensions(std::vector& v) { v.push_back("dcm"); v.push_back(""); } //===================================================================== //======================================================================== std::string irclean(const std::string& str) { if(str.size() > 0) { if (str == "GDCM::Unfound") { return ""; } if (str[str.size()-1]==' ') { return irclean(str.substr(0,str.size()-1)); } if (str[str.size()-1]==0) { return irclean(str.substr(0,str.size()-1)); } } return str; } //======================================================================== void DicomImageReader::getAttributes(const std::string filename, std::map &infos, std::vector i_attr) { std::vector::iterator it = i_attr.begin(); for(; it != i_attr.end(); it++) { infos[(*it)] = ""; } ReadAttributes(filename, infos); } //===================================================================== void DicomImageReader::ReadAttributes(const std::string& filename, std::map& attr) { GimmickMessage(2,"Reading attributes from DICOM file '" < file(GDCM_NAME_SPACE::File::New());//, DicomImageReader::deleter()); GDCM_NAME_SPACE::Document *doc= GDCM_NAME_SPACE::File::New(); doc->SetLoadMode( GDCM_NAME_SPACE::LD_ALL); doc->SetFileName(filename.c_str()); doc->Load(); file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL); file->SetFileName(filename.c_str()); file->Load(); if (file->IsReadable())// ||((GDCM_NAME_SPACE::Document*) file)->IsReadable()) { std::map::iterator i; for (i=attr.begin();i!=attr.end();++i) { if ( i->first == "D0004_1500" ) { boost::filesystem::path full_path(filename); std::string f = full_path.leaf(); i->second = f; } else if ( i->first == "FullFileName" ) { i->second = filename; } else if ( i->first == "FullFileDirectory" ) { std::string::size_type last_pos = filename.find_last_of("//"); //find first separator i->second = filename.substr(0, last_pos); } else { uint16_t el; uint16_t gr; tree::AttributeDescriptor::GetDicomGroupElementFromKey(i->first,gr,el); if ( ( gr!=0 ) && ( el!=0 ) ) { std::string val = file->GetEntryString(gr,el); i->second = irclean(val); } } } } } //===================================================================== } // namespace creaImageIO