]> Creatis software - clitk.git/blob - common/clitkImageCommon.cxx
revived old fast_make script / clean some dependencies
[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
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 (verbose) {
67     std::cout << "Reading DICOM <" << filename << ">" << std::endl;
68   }
69   gdcm::File *header = new gdcm::File();
70   header->SetFileName(filename);
71   header->SetMaxSizeLoadEntry(16384); // required ?
72   header->Load();
73   return header;
74 }
75 ///--------------------------------------------------------------------
76
77 //--------------------------------------------------------------------
78 itk::ImageIOBase::Pointer clitk::readImageHeader(const std::string & filename, bool exit_on_error)
79 {
80   itk::ImageIOBase::Pointer reader =
81     itk::ImageIOFactory::CreateImageIO(filename.c_str(), itk::ImageIOFactory::ReadMode);
82   if (!reader) {
83     if (exit_on_error) { //default behavior for tools who don't handle the problem
84       clitkExceptionMacro("Error reading file " << filename << ", exiting immediately");
85     } else return NULL;
86   }
87   reader->SetFileName(filename);
88   reader->ReadImageInformation();
89   return reader;
90 }
91 //--------------------------------------------------------------------
92
93 //--------------------------------------------------------------------
94 void clitk::printImageHeader(itk::ImageIOBase::Pointer header, std::ostream & os, const int level)
95 {
96   unsigned int dim = header->GetNumberOfDimensions();
97   std::string pixelTypeName = header->GetComponentTypeAsString(header->GetComponentType());
98   std::vector<int> inputSize;
99   std::vector<double> inputSpacing;
100   std::vector<double> inputOrigin;
101   inputSize.resize(dim);
102   inputSpacing.resize(dim);
103   inputOrigin.resize(dim);
104   for(unsigned int i=0; i<dim; i++) {
105     inputSpacing[i] = header->GetSpacing(i);
106     inputSize[i] = header->GetDimensions(i);
107     inputOrigin[i] = header->GetOrigin(i);
108   }
109   int pixelSize =
110     clitk::GetTypeSizeFromString(header->GetComponentTypeAsString(header->GetComponentType()));
111   unsigned int nbOfComponents = header->GetNumberOfComponents();
112   if (level == 0) {
113     os << dim << "D ";
114     if (nbOfComponents !=1) os << nbOfComponents << "x" << pixelTypeName;
115     else os << pixelTypeName;
116     os << " ";
117     for(unsigned int i=0; i< dim-1; i++)
118       os << inputSize[i] << "x";
119     os << inputSize[dim-1]
120        << "  ";
121     for(unsigned int i=0; i< dim-1; i++)
122       os << inputSpacing[i] << "x";
123     os << inputSpacing[dim-1]
124        << "  ";
125     for(unsigned int i=0; i< dim-1; i++)
126       os << inputOrigin[i] << "x";
127     os << inputOrigin[dim-1] << " ";
128     os << header->GetImageSizeInPixels() << " ";
129   } else {
130     os << "Dim       = " << dim << "D" << std::endl;
131     os << "PixelType = " << pixelTypeName << std::endl;
132     if (nbOfComponents > 1)
133       os << "Vector    = " << nbOfComponents << std::endl;
134     os << "Size      = ";
135     for(unsigned int i=0; i< dim; i++) {
136       os << inputSize[i] << " ";
137     }
138     os << std::endl;
139     os << "Spacing   = ";
140     for(unsigned int i=0; i< dim; i++) {
141       os << inputSpacing[i] << " ";
142     }
143     os << std::endl;
144     if (level > 1) {
145       os << "# voxels  = " << header->GetImageSizeInPixels() << std::endl;
146       os << "Size (mm) = ";
147       for(unsigned int i=0; i< dim; i++) {
148         os << inputSize[i]*inputSpacing[i] << " ";
149       }
150       os << "mm" << std::endl;
151       os << "Origin (mm)= ";
152       for(unsigned int i=0; i< dim; i++) {
153         os << inputOrigin[i] << " ";
154       }
155       os << "mm" << std::endl;
156
157       os << "Volume    = ";
158       double vol=1.0;
159       for(unsigned int i=0; i< dim; i++) {
160         vol *= inputSize[i]*inputSpacing[i]/10.0;
161       }
162       os << vol << " cc" << std::endl;
163       int mem = header->GetImageSizeInPixels()*pixelSize*nbOfComponents;
164       double memKb = (double)mem/1024.0;
165       double memMb = (double)mem/1024.0/1024.0;
166       double memGb = (double)mem/1024.0/1024.0/1024.0;
167       if (lrint(memKb) <= 0)
168         os << "Memory    = " << mem << " bytes" << std::endl;
169       else {
170         if (lrint(memMb) <= 0)
171           os << "Memory    = " << memKb << " Kb (" << mem << " bytes)" << std::endl;
172         else {
173           if (lrint(memGb) <= 0)
174             os << "Memory    = " << memMb << " Mb (" << mem << " bytes)" << std::endl;
175           else
176             os << "Memory     = " << memGb << " Gb (" << mem << " bytes)" << std::endl;
177         }
178       }
179     }
180   }
181 }
182 //--------------------------------------------------------------------
183
184 #endif /* end #define CLITKIMAGECOMMON_CXX */
185