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