X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FcreaImageIODicomImageReader2.cpp;h=5b6861ccf46fc63ce510dfa4f6526c9ba41cbee0;hb=7fe8cc3b940607846369ea5d10e2c2aaa6359862;hp=3dd8120f299a35ea3c47e965202eda047be4f369;hpb=3a22e19184c369b130d4caa992a8e98e50c7a0ee;p=creaImageIO.git diff --git a/src/creaImageIODicomImageReader2.cpp b/src/creaImageIODicomImageReader2.cpp index 3dd8120..5b6861c 100644 --- a/src/creaImageIODicomImageReader2.cpp +++ b/src/creaImageIODicomImageReader2.cpp @@ -1,14 +1,42 @@ -#include - - - -#include +/* +# --------------------------------------------------------------------- +# +# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image +# pour la Santé) +# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton +# Previous Authors : Laurent Guigues, Jean-Pierre Roux +# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil +# +# This software is governed by the CeCILL-B license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL-B +# license as circulated by CEA, CNRS and INRIA at the following URL +# http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +# or in the file LICENSE.txt. +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL-B license and that you accept its terms. +# ------------------------------------------------------------------------ +*/ + + +#include "creaImageIODicomImageReader2.h" +#include +#include "gdcmStringFilter.h" +#include "gdcmUIDs.h" #include "boost/filesystem/path.hpp" -#include +#include "vtkGDCMImageReader.h" #include -#include - +#if defined(_WIN32) +#pragma warning(disable: 4996) +#endif #ifdef _DEBUG #define new DEBUG_NEW @@ -19,8 +47,8 @@ namespace creaImageIO //===================================================================== DicomImageReader::DicomImageReader() { - mReader = vtkGDCMImageReader::New(); - SetName ( "Dicom" ); + mReader = vtkGDCMImageReader::New(); + SetName ( "Dicom" ); }; //===================================================================== @@ -28,14 +56,14 @@ namespace creaImageIO //===================================================================== DicomImageReader::~DicomImageReader() { - mReader->Delete(); + mReader->Delete(); } //===================================================================== //===================================================================== bool DicomImageReader::CanRead(const std::string& filename) { - gdcm::Reader reader; + gdcm::Reader reader; reader.SetFileName( filename.c_str() ); return reader.Read(); @@ -59,6 +87,16 @@ namespace creaImageIO im = 0; } return im; + //gdcm::Tag grouplength(0x0000,0x0000); + //gdcm::DataElement de(gdcm::Tag(0x0000, 0x0000)); + //de.SetByteValue("0",gdcm::VR::UL); + // + // + //gdcm::UIDs::GetUIDString(gdcm::UIDS::uid_1_2_840_10008_1_1),gdcm::VR::UI); + + //std::ostream os; + //de.Write(&os); + } //===================================================================== @@ -67,8 +105,7 @@ namespace creaImageIO v.push_back("dcm"); v.push_back(""); } - //===================================================================== - + //======================================================================== std::string irclean(const std::string& str) { @@ -91,59 +128,90 @@ namespace creaImageIO return str; } //======================================================================== - + //===================================================================== + + + void DicomImageReader::getAttributes(const std::string filename, + std::map &infos, std::vector i_attr) + { + gdcm::Reader reader; + reader.SetFileName( filename.c_str() ); + if (reader.Read()) + { + std::vector::iterator it = i_attr.begin(); + for(;it != i_attr.end(); it++) + { + unsigned short el; + unsigned short gr; + sscanf((*it).c_str(),"D%04hx_%04hx",&gr,&el); + if ( ( gr!=0 ) && ( el!=0 ) ) + { + infos[(*it)] = ( GetStringValueFromTag(reader.GetFile().GetDataSet().GetDataElement(gdcm::Tag(gr,el))) ); + } + } + } + } + //===================================================================== void DicomImageReader::ReadAttributes(const std::string& filename, std::map& attr) { - GimmickMessage(2,"Reading attributes from DICOM file '" - <::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" ) + gdcm::StringFilter sf; + sf.SetFile(reader.GetFile()); + std::map::iterator i; + for (i=attr.begin();i!=attr.end();++i) { - 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 ) ) - { - gdcm::DataElement de( gdcm::Tag(gr,el) ); - std::string val = GetStringValueFromTag(reader.GetFile().GetDataSet().GetDataElement(gdcm::Tag(gr,el))); - i->second = irclean(val); + if ( i->first == "D0004_1500" ) + { + boost::filesystem::path full_path(filename); + std::string f = full_path.leaf().string(); + 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; + { + gdcm::Attribute< 0x0008,0x103e> at; + std::string sr; + at.SetValue(sr); + + } + tree::AttributeDescriptor::GetDicomGroupElementFromKey(i->first,gr,el); + //if ( ( gr!=0 ) && ( el!=0 ) ) + const gdcm::Tag tag(gr, el); + if( reader.GetFile().GetDataSet().FindDataElement( tag ) ) + { + i->second = irclean(sf.ToString(tag)); + } + else + { + i->second = ""; + } + } } - } } - } } void DicomImageReader::ReadAttributes2(const std::string& filename, std::map& attr) { - if(!b_loaded) { std::map::iterator i; @@ -175,7 +243,7 @@ void DicomImageReader::ReadAttributes2(const std::string& filename, if ( i->first == "D0004_1500" ) { boost::filesystem::path full_path(filename); - std::string f = full_path.leaf(); + std::string f = full_path.leaf().string(); i->second = f; } else if ( i->first == "FullFileName" ) @@ -197,22 +265,7 @@ void DicomImageReader::ReadAttributes2(const std::string& filename, } } - - - - - - - - - - - - - - - - const std::string DicomImageReader::GetStringValueFromTag(const gdcm::DataElement& de) +const std::string DicomImageReader::GetStringValueFromTag(const gdcm::DataElement& de) { static std::string buffer; buffer = ""; // cleanup previous call @@ -225,7 +278,6 @@ void DicomImageReader::ReadAttributes2(const std::string& filename, // Will be padded with at least one \0 } - // Since return is a const char* the very first \0 will be considered return buffer.c_str(); }