]> Creatis software - clitk.git/blob - common/clitkImageCommon.cxx
changes in license header
[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://www.centreleonberard.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
19 #ifndef CLITKIMAGECOMMON_CXX
20 #define CLITKIMAGECOMMON_CXX
21
22 #include "clitkImageCommon.h"
23 #include "clitkCommon.h"
24
25 //--------------------------------------------------------------------
26 void clitk::ReadImageDimensionAndPixelType(const std::string & filename,
27                                            int & dimension,
28                                            std::string & pixeType)
29 {
30   itk::ImageIOBase::Pointer genericReader =
31     itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode);
32   if (!genericReader) {
33     clitkExceptionMacro("Image file format unknown while reading file <" << filename << ">");
34   }
35   genericReader->SetFileName(filename.c_str());
36   genericReader->ReadImageInformation();
37   pixeType = genericReader->GetComponentTypeAsString(genericReader->GetComponentType());
38   dimension = genericReader->GetNumberOfDimensions();
39 }
40 //--------------------------------------------------------------------
41
42
43 //--------------------------------------------------------------------
44 void clitk::ReadImageDimensionAndPixelType(const std::string & filename,
45                                            int & dimension,
46                                            std::string & pixeType, int & components)
47 {
48   itk::ImageIOBase::Pointer genericReader =
49     itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode);
50   if (!genericReader) {
51     clitkExceptionMacro("Image file format unknown while reading file <" << filename << ">");
52   }
53   genericReader->SetFileName(filename.c_str());
54   genericReader->ReadImageInformation();
55   pixeType = genericReader->GetComponentTypeAsString(genericReader->GetComponentType());
56   dimension = genericReader->GetNumberOfDimensions();
57   components= genericReader->GetNumberOfComponents();
58 }
59 //--------------------------------------------------------------------
60
61 //--------------------------------------------------------------------
62 // Read a dicom header
63 gdcm::File * clitk::readDicomHeader(const std::string & filename,
64                                     const bool verbose)
65 {
66 #if GDCM_MAJOR_VERSION == 2
67   gdcm::Reader hreader;
68   hreader.SetFileName(filename.c_str());
69   hreader.Read();
70   gdcm::SmartPointer<gdcm::File> p = hreader.GetFile();
71   return p;
72 #else
73   if (verbose) {
74     std::cout << "Reading DICOM <" << filename << ">" << std::endl;
75   }
76   gdcm::File *header = new gdcm::File();
77   header->SetFileName(filename);
78   header->SetMaxSizeLoadEntry(16384); // required ?
79   header->Load();
80   return header;
81 #endif
82 }
83 ///--------------------------------------------------------------------
84
85 //--------------------------------------------------------------------
86 itk::ImageIOBase::Pointer clitk::readImageHeader(const std::string & filename, bool exit_on_error)
87 {
88   itk::ImageIOBase::Pointer reader =
89     itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode);
90   if (!reader) {
91     if (exit_on_error) { //default behavior for tools who don't handle the problem
92       clitkExceptionMacro("Error reading file " << filename << ", exiting immediately");
93     } else return NULL;
94   }
95   reader->SetFileName(filename);
96   reader->ReadImageInformation();
97   return reader;
98 }
99 //--------------------------------------------------------------------
100
101 //--------------------------------------------------------------------
102 void clitk::printImageHeader(itk::ImageIOBase::Pointer header, std::ostream & os, const int level)
103 {
104   unsigned int dim = header->GetNumberOfDimensions();
105   std::string pixelTypeName = header->GetComponentTypeAsString(header->GetComponentType());
106   std::vector<int> inputSize;
107   std::vector<double> inputSpacing;
108   std::vector<double> inputOrigin;
109   inputSize.resize(dim);
110   inputSpacing.resize(dim);
111   inputOrigin.resize(dim);
112   for(unsigned int i=0; i<dim; i++) {
113     inputSpacing[i] = header->GetSpacing(i);
114     inputSize[i] = header->GetDimensions(i);
115     inputOrigin[i] = header->GetOrigin(i);
116   }
117   int pixelSize =
118     clitk::GetTypeSizeFromString(header->GetComponentTypeAsString(header->GetComponentType()));
119   unsigned int nbOfComponents = header->GetNumberOfComponents();
120   if (level == 0) {
121     os << dim << "D ";
122     if (nbOfComponents !=1) os << nbOfComponents << "x" << pixelTypeName;
123     else os << pixelTypeName;
124     os << " ";
125     for(unsigned int i=0; i< dim-1; i++)
126       os << inputSize[i] << "x";
127     os << inputSize[dim-1]
128        << "  ";
129     for(unsigned int i=0; i< dim-1; i++)
130       os << inputSpacing[i] << "x";
131     os << inputSpacing[dim-1]
132        << "  ";
133     for(unsigned int i=0; i< dim-1; i++)
134       os << inputOrigin[i] << "x";
135     os << inputOrigin[dim-1] << " ";
136     os << header->GetImageSizeInPixels() << " ";
137   } else {
138     os << "Dim       = " << dim << "D" << std::endl;
139     os << "PixelType = " << pixelTypeName << std::endl;
140     if (nbOfComponents > 1)
141       os << "Vector    = " << nbOfComponents << std::endl;
142     os << "Size      = ";
143     for(unsigned int i=0; i< dim; i++) {
144       os << inputSize[i] << " ";
145     }
146     os << std::endl;
147     os << "Spacing   = ";
148     for(unsigned int i=0; i< dim; i++) {
149       os << inputSpacing[i] << " ";
150     }
151     os << std::endl;
152     if (level > 1) {
153       os << "# voxels  = " << header->GetImageSizeInPixels() << std::endl;
154       os << "Size (mm) = ";
155       for(unsigned int i=0; i< dim; i++) {
156         os << inputSize[i]*inputSpacing[i] << " ";
157       }
158       os << "mm" << std::endl;
159       os << "Origin (mm)= ";
160       for(unsigned int i=0; i< dim; i++) {
161         os << inputOrigin[i] << " ";
162       }
163       os << "mm" << std::endl;
164
165       os << "Volume    = ";
166       double vol=1.0;
167       for(unsigned int i=0; i< dim; i++) {
168         vol *= inputSize[i]*inputSpacing[i]/10.0;
169       }
170       os << vol << " cc" << std::endl;
171       int mem = header->GetImageSizeInPixels()*pixelSize*nbOfComponents;
172       double memKb = (double)mem/1024.0;
173       double memMb = (double)mem/1024.0/1024.0;
174       double memGb = (double)mem/1024.0/1024.0/1024.0;
175       if (lrint(memKb) <= 0)
176         os << "Memory    = " << mem << " bytes" << std::endl;
177       else {
178         if (lrint(memMb) <= 0)
179           os << "Memory    = " << memKb << " Kb (" << mem << " bytes)" << std::endl;
180         else {
181           if (lrint(memGb) <= 0)
182             os << "Memory    = " << memMb << " Mb (" << mem << " bytes)" << std::endl;
183           else
184             os << "Memory     = " << memGb << " Gb (" << mem << " bytes)" << std::endl;
185         }
186       }
187     }
188   }
189 }
190 //--------------------------------------------------------------------
191
192 #endif /* end #define CLITKIMAGECOMMON_CXX */
193