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