]> Creatis software - clitk.git/blob - common/clitkImageCommon.cxx
workaround for bug in itk/gdcmDict.h : gdcm headers seem to need to be included
[clitk.git] / common / clitkImageCommon.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
18 #ifndef CLITKIMAGECOMMON_CXX
19 #define CLITKIMAGECOMMON_CXX
20 /**
21    ------------------------------------------------=
22    * @file   clitkImageCommon.cxx
23    * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
24    * @date   02 Oct 2007 14:30:47
25    *
26    * @brief
27    *
28    *
29    ------------------------------------------------=*/
30
31 #include "clitkImageCommon.h"
32
33 //--------------------------------------------------------------------
34 void clitk::ReadImageDimensionAndPixelType(const std::string & filename,
35     int & dimension,
36     std::string & pixeType)
37 {
38   itk::ImageIOBase::Pointer genericReader =
39     itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode);
40   if (!genericReader) {
41     std::cerr << "Image file format unknown while reading file <" << filename << ">" << std::endl;
42     exit(0);
43   }
44   genericReader->SetFileName(filename.c_str());
45   genericReader->ReadImageInformation();
46   pixeType = genericReader->GetComponentTypeAsString(genericReader->GetComponentType());
47   dimension = genericReader->GetNumberOfDimensions();
48 }
49 //--------------------------------------------------------------------
50
51
52 //--------------------------------------------------------------------
53 void clitk::ReadImageDimensionAndPixelType(const std::string & filename,
54     int & dimension,
55     std::string & pixeType, int & components)
56 {
57   itk::ImageIOBase::Pointer genericReader =
58     itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode);
59   if (!genericReader) {
60     std::cerr << "Image file format unknown while reading " << filename << std::endl;
61     exit(0);
62   }
63   genericReader->SetFileName(filename.c_str());
64   genericReader->ReadImageInformation();
65   pixeType = genericReader->GetComponentTypeAsString(genericReader->GetComponentType());
66   dimension = genericReader->GetNumberOfDimensions();
67   components= genericReader->GetNumberOfComponents();
68 }
69 //--------------------------------------------------------------------
70
71 //--------------------------------------------------------------------
72 // Read a dicom header
73 gdcm::File * clitk::readDicomHeader(const std::string & filename,
74                                     const bool verbose)
75 {
76   if (verbose) {
77     std::cout << "Reading DICOM <" << filename << ">" << std::endl;
78   }
79   gdcm::File *header = new gdcm::File();
80   header->SetFileName(filename);
81   header->SetMaxSizeLoadEntry(16384); // required ?
82   header->Load();
83   return header;
84 }
85 ///--------------------------------------------------------------------
86
87 //--------------------------------------------------------------------
88 itk::ImageIOBase::Pointer clitk::readImageHeader(const std::string & filename, bool exit_on_error)
89 {
90   itk::ImageIOBase::Pointer reader =
91     itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode);
92   if (!reader) {
93     if (exit_on_error) { //default behavior for tools who don't handle the problem
94       std::cerr << "Error reading file " << filename << ", exiting immediately" << std::endl;
95       std::exit(-1);
96     } else
97       return NULL;
98   }
99   reader->SetFileName(filename);
100   reader->ReadImageInformation();
101   return reader;
102 }
103 //--------------------------------------------------------------------
104
105 //--------------------------------------------------------------------
106 void clitk::printImageHeader(itk::ImageIOBase::Pointer header, std::ostream & os, const int level)
107 {
108   unsigned int dim = header->GetNumberOfDimensions();
109   std::string pixelTypeName = header->GetComponentTypeAsString(header->GetComponentType());
110   std::vector<int> inputSize;
111   std::vector<double> inputSpacing;
112   std::vector<double> inputOrigin;
113   inputSize.resize(dim);
114   inputSpacing.resize(dim);
115   inputOrigin.resize(dim);
116   for(unsigned int i=0; i<dim; i++) {
117     inputSpacing[i] = header->GetSpacing(i);
118     inputSize[i] = header->GetDimensions(i);
119     inputOrigin[i] = header->GetOrigin(i);
120   }
121   int pixelSize =
122     clitk::GetTypeSizeFromString(header->GetComponentTypeAsString(header->GetComponentType()));
123   unsigned int nbOfComponents = header->GetNumberOfComponents();
124   if (level == 0) {
125     os << dim << "D ";
126     if (nbOfComponents !=1) os << nbOfComponents << "x" << pixelTypeName;
127     else os << pixelTypeName;
128     os << " ";
129     for(unsigned int i=0; i< dim-1; i++)
130       os << inputSize[i] << "x";
131     os << inputSize[dim-1]
132        << "  ";
133     for(unsigned int i=0; i< dim-1; i++)
134       os << inputSpacing[i] << "x";
135     os << inputSpacing[dim-1]
136        << "  ";
137     for(unsigned int i=0; i< dim-1; i++)
138       os << inputOrigin[i] << "x";
139     os << inputOrigin[dim-1] << " ";
140     os << header->GetImageSizeInPixels() << " ";
141   } else {
142     os << "Dim       = " << dim << "D" << std::endl;
143     os << "PixelType = " << pixelTypeName << std::endl;
144     if (nbOfComponents > 1)
145       os << "Vector    = " << nbOfComponents << std::endl;
146     os << "Size      = ";
147     for(unsigned int i=0; i< dim; i++) {
148       os << inputSize[i] << " ";
149     }
150     os << std::endl;
151     os << "Spacing   = ";
152     for(unsigned int i=0; i< dim; i++) {
153       os << inputSpacing[i] << " ";
154     }
155     os << std::endl;
156     if (level > 1) {
157       os << "# voxels  = " << header->GetImageSizeInPixels() << std::endl;
158       os << "Size (mm) = ";
159       for(unsigned int i=0; i< dim; i++) {
160         os << inputSize[i]*inputSpacing[i] << " ";
161       }
162       os << "mm" << std::endl;
163       os << "Origin (mm)= ";
164       for(unsigned int i=0; i< dim; i++) {
165         os << inputOrigin[i] << " ";
166       }
167       os << "mm" << std::endl;
168
169       os << "Volume    = ";
170       double vol=1.0;
171       for(unsigned int i=0; i< dim; i++) {
172         vol *= inputSize[i]*inputSpacing[i]/10.0;
173       }
174       os << vol << " cc" << std::endl;
175       int mem = header->GetImageSizeInPixels()*pixelSize*nbOfComponents;
176       double memKb = (double)mem/1024.0;
177       double memMb = (double)mem/1024.0/1024.0;
178       double memGb = (double)mem/1024.0/1024.0/1024.0;
179       if (lrint(memKb) <= 0)
180         os << "Memory    = " << mem << " bytes" << std::endl;
181       else {
182         if (lrint(memMb) <= 0)
183           os << "Memory    = " << memKb << " Kb (" << mem << " bytes)" << std::endl;
184         else {
185           if (lrint(memGb) <= 0)
186             os << "Memory    = " << memMb << " Mb (" << mem << " bytes)" << std::endl;
187           else
188             os << "Memory     = " << memGb << " Gb (" << mem << " bytes)" << std::endl;
189         }
190       }
191     }
192   }
193 }
194 //--------------------------------------------------------------------
195
196 #endif /* end #define CLITKIMAGECOMMON_CXX */
197