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