creaImageIO_lib
creaImageIODicomImageReader.cpp
Go to the documentation of this file.
1 /*
2 # ---------------------------------------------------------------------
3 #
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
5 # pour la Santé)
6 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
9 #
10 # This software is governed by the CeCILL-B license under French law and
11 # abiding by the rules of distribution of free software. You can use,
12 # modify and/ or redistribute the software under the terms of the CeCILL-B
13 # license as circulated by CEA, CNRS and INRIA at the following URL
14 # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15 # or in the file LICENSE.txt.
16 #
17 # As a counterpart to the access to the source code and rights to copy,
18 # modify and redistribute granted by the license, users are provided only
19 # with a limited warranty and the software's author, the holder of the
20 # economic rights, and the successive licensors have only limited
21 # liability.
22 #
23 # The fact that you are presently reading this means that you have had
24 # knowledge of the CeCILL-B license and that you accept its terms.
25 # ------------------------------------------------------------------------
26 */
27 
28 
30 #include <vtkGdcmReader.h>
31 #include <creaImageIOSystem.h>
32 #include "boost/filesystem/path.hpp"
33 
35 #include <vtkStringArray.h>
36 #include <creaImageIOGimmick.h>
37 #ifdef _DEBUG
38 #define new DEBUG_NEW
39 #endif
40 namespace creaImageIO
41 {
42 
43  //=====================================================================
45  {
46  mReader = vtkGdcmReader::New();
47 
48 //EED 21 mars 2012 FLIP probleme ..PLOP..
49  mReader->SetFlipY(false);
50 
51  SetName ( "Dicom" );
52 
53  };
54  //=====================================================================
55 
56  //=====================================================================
58  {
59  mReader->Delete();
60  }
61  //=====================================================================
62 
63  //=====================================================================
64  bool DicomImageReader::CanRead(const std::string& filename)
65  {
66  GDCM_NAME_SPACE::Document*doc;
67  GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
68  file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
69  file->SetFileName(filename.c_str());
70  file->Load();
71  bool ok = file->IsReadable();
72  if(!ok)
73  {
74  doc = (GDCM_NAME_SPACE::Document*)file;
75  ok = doc->IsReadable();
76  }
77  file->Delete();
78  return ok;
79  }
80  //=====================================================================
81 
82  //=====================================================================
83  vtkImageData* DicomImageReader::ReadImage(const std::string& filename)
84  {
85  vtkImageData* im = 0;
86  try
87  {
88  mReader->SetFileName(filename.c_str());
89  mReader->Update();
90  im = vtkImageData::New();
91  im->ShallowCopy(mReader->GetOutput());
92  }
93  catch (...)
94  {
95  if (im!=0) im->Delete();
96  im = 0;
97  }
98  return im;
99  }
100 
101  //=====================================================================
102  void DicomImageReader::PushBackExtensions(std::vector<std::string>& v)
103  {
104  v.push_back("dcm");
105  v.push_back("");
106  }
107  //=====================================================================
108 
109  //========================================================================
110  std::string irclean(const std::string& str)
111  {
112  if(str.size() > 0)
113  {
114  if (str == "GDCM::Unfound")
115  {
116  return "";
117  }
118  if (str[str.size()-1]==' ')
119  {
120  return irclean(str.substr(0,str.size()-1));
121  }
122  if (str[str.size()-1]==0)
123  {
124  return irclean(str.substr(0,str.size()-1));
125  }
126  }
127 
128  return str;
129  }
130  //========================================================================
131  void DicomImageReader::getAttributes(const std::string filename,
132  std::map <std::string , std::string> &infos, std::vector<std::string> i_attr)
133  {
134  std::vector<std::string>::iterator it = i_attr.begin();
135  for(; it != i_attr.end(); it++)
136  {
137  infos[(*it)] = "";
138  }
139  ReadAttributes(filename, infos);
140  }
141  //=====================================================================
142  void DicomImageReader::ReadAttributes(const std::string& filename,
143  std::map<std::string,std::string>& attr)
144  {
145  GimmickMessage(2,"Reading attributes from DICOM file '"
146  <<filename<<"'"<<std::endl);
147 
148  GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
149  //boost::shared_ptr<GDCM_NAME_SPACE::File> file(GDCM_NAME_SPACE::File::New());//, DicomImageReader::deleter());
150 
151  GDCM_NAME_SPACE::Document *doc= GDCM_NAME_SPACE::File::New();
152  doc->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
153  doc->SetFileName(filename.c_str());
154  doc->Load();
155  file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
156  file->SetFileName(filename.c_str());
157  file->Load();
158  if (file->IsReadable())// ||((GDCM_NAME_SPACE::Document*) file)->IsReadable())
159  {
160  std::map<std::string,std::string>::iterator i;
161  for (i=attr.begin();i!=attr.end();++i)
162  {
163  if ( i->first == "D0004_1500" )
164  {
165  boost::filesystem::path full_path(filename);
166  std::string f = full_path.leaf().string();
167  i->second = f;
168  }
169  else if ( i->first == "FullFileName" )
170  {
171  i->second = filename;
172  }
173  else if ( i->first == "FullFileDirectory" )
174  {
175  std::string::size_type last_pos = filename.find_last_of("//");
176  //find first separator
177  i->second = filename.substr(0, last_pos);
178  }
179  else
180  {
181  uint16_t el;
182  uint16_t gr;
183 
185  if ( ( gr!=0 ) && ( el!=0 ) )
186  {
187  std::string val = file->GetEntryString(gr,el);
188  i->second = irclean(val);
189  }
190  }
191  }
192  }
193  }
194 
195  //=====================================================================
196 
197 } // namespace creaImageIO
198