]> Creatis software - clitk.git/blob - tools/clitkImageCreate.cxx
Initial revision
[clitk.git] / tools / clitkImageCreate.cxx
1 /*------------------------------------------------------------------------=
2                                                                                  
3   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
4   l'Image). All rights reserved. See Doc/License.txt or
5   http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
6                                                                                 
7   This software is distributed WITHOUT ANY WARRANTY; without even
8   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
9   PURPOSE.  See the above copyright notices for more information.
10                                                                              
11   ------------------------------------------------------------------------=*/
12
13 #ifndef CLITKIMAGECREATE_CXX
14 #define CLITKIMAGECREATE_CXX
15
16 /**
17    ------------------------------------------------=
18    * @file   clitkImageCreate.cxx
19    * @author David Sarrut <David.Sarrut@creatis.insa-lyon.fr>
20    * @date   14 Oct 2008 08:37:53
21    ------------------------------------------------=*/
22
23 // clitk include
24 #include "clitkImageCreate_ggo.h"
25 #include "clitkCommon.h"
26 #include "clitkImageCommon.h"
27 #include "clitkIO.h"
28
29 template<class ImageType>
30 void NewFilledImage(int * size, float * spacing, double * origin,
31                     double value,typename ImageType::Pointer output) 
32 {
33   static const unsigned int Dim = ImageType::GetImageDimension();
34   typename ImageType::SizeType mSize;
35   mSize.Fill (0);
36   for(unsigned int i=0; i<Dim; i++) mSize[i] = size[i];
37   typename ImageType::RegionType mRegion;
38   mRegion.SetSize(mSize);
39   typename ImageType::SpacingType mSpacing;
40   for(unsigned int i=0; i<Dim; i++) mSpacing[i] = spacing[i];
41   output->SetRegions(mRegion);
42   output->SetSpacing(mSpacing);
43   output->Allocate();
44   typename ImageType::PointType mOrigin;
45   for(unsigned int i=0; i<Dim; i++) mOrigin[i] = origin[i];
46   output->SetOrigin(mOrigin);
47   typedef typename ImageType::PixelType PixelType;
48   PixelType p = clitk::PixelTypeDownCast<double, PixelType>(value);
49   output->FillBuffer(p);
50 }
51
52
53 //--------------------------------------------------------------------
54 int main(int argc, char * argv[]) {
55
56   // Init command line
57   GGO(clitkImageCreate, args_info);
58   CLITK_INIT;
59
60   // Check --like option
61   int dim;
62   if (args_info.like_given) {
63     itk::ImageIOBase::Pointer header = clitk::readImageHeader(args_info.like_arg);
64      dim = header->GetNumberOfDimensions();
65      //mPixelTypeName = header->GetComponentTypeAsString(header->GetComponentType());  
66      //mNbOfComponents = header->GetNumberOfComponents();
67      args_info.size_given = dim;
68      args_info.size_arg = new int[dim];
69      args_info.spacing_given = dim;
70      args_info.spacing_arg = new float[dim];
71      args_info.origin_given = dim;
72      args_info.origin_arg = new double[dim];
73      
74      for(int i=0; i<dim; i++) {
75        args_info.size_arg[i] = header->GetDimensions(i);
76        args_info.spacing_arg[i] = header->GetSpacing(i);
77        args_info.origin_arg[i]=   header->GetOrigin(i);
78      }
79   }
80
81   // Check dimension
82   if ((args_info.size_given > 4) || (args_info.size_given <2)) {
83     std::cerr << "ERROR : only 2D/3D/4D image ! Please give 2 or 3 or 4 number to the --size option." << std::endl;
84     exit(-1);
85   }
86   dim = args_info.size_given;
87   
88   // origin 
89   std::vector<double> origin;
90   origin.resize(dim);
91   for(int i=0; i<dim; i++) origin[i]=0.;
92   if (args_info.origin_given)
93     {
94       if (args_info.origin_given==1)
95         for(int i=0; i<dim; i++) origin[i] = args_info.origin_arg[0];
96       else 
97         {
98           if (args_info.origin_given != args_info.size_given) {
99             std::cerr << "ERROR : please give the same number of values for --origin and --size." << std::endl;
100             exit(-1);
101           }
102           for(int i=0; i<dim; i++) origin[i] = args_info.origin_arg[i]; 
103         }
104     }
105
106   // spacing 
107   std::vector<float> spacing;
108   spacing.resize(dim);
109   if (args_info.spacing_given == 1) {
110     for(int i=0; i<dim; i++) spacing[i] = args_info.spacing_arg[0];
111   }
112   else {
113     if (args_info.spacing_given != args_info.size_given) {
114       std::cerr << "ERROR : please give the same number of values for --size and --spacing." << std::endl;
115       exit(-1);
116     }
117     for(int i=0; i<dim; i++) spacing[i] = args_info.spacing_arg[i];
118   }
119   
120   // Create new image
121   typedef float PixelType;
122   if (dim == 2) {
123     const int Dim=2;
124     typedef itk::Image<PixelType, Dim> ImageType; 
125     ImageType::Pointer output = ImageType::New();
126     NewFilledImage<ImageType>(args_info.size_arg, &spacing[0], &origin[0], args_info.value_arg, output);
127     clitk::writeImage<ImageType>(output, args_info.output_arg);
128   }
129   if (dim == 3) {
130     const int Dim=3;
131     typedef itk::Image<PixelType, Dim> ImageType; 
132     ImageType::Pointer output = ImageType::New();
133     NewFilledImage<ImageType>(args_info.size_arg, &spacing[0], &origin[0], args_info.value_arg, output);
134     clitk::writeImage<ImageType>(output, args_info.output_arg);
135   }
136   if (dim == 4) {
137     const int Dim=4;
138     typedef itk::Image<PixelType, Dim> ImageType; 
139     ImageType::Pointer output = ImageType::New();
140     NewFilledImage<ImageType>(args_info.size_arg, &spacing[0], &origin[0], args_info.value_arg, output);
141     clitk::writeImage<ImageType>(output, args_info.output_arg);
142   }
143   
144   // this is the end my friend  
145   return 0;
146 } // end main
147
148 #endif //define CLITKIMAGEARITHM_CXX