]> Creatis software - clitk.git/blob - filters/clitkImageConvertGenericFilter.cxx
9323e8f0c2125d6b4999941b03c8adfcc8dbc659
[clitk.git] / filters / clitkImageConvertGenericFilter.cxx
1 #ifndef CLITKIMAGECONVERTGENERICFILTER_CXX
2 #define CLITKIMAGECONVERTGENERICFILTER_CXX
3 /**
4  -------------------------------------------------
5  * @file   clitkImageConvertGenericFilter.cxx
6  * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
7  * @date   05 May 2008 10:57:19
8  * 
9  * @brief  
10  * 
11  * 
12  -------------------------------------------------*/
13
14 #include "clitkImageConvertGenericFilter.h"
15
16 //--------------------------------------------------------------------
17 clitk::ImageConvertGenericFilter::ImageConvertGenericFilter():
18   clitk::ImageToImageGenericFilter<Self>("ImageConvert") {
19   mOutputPixelTypeName = "NotSpecified";
20   InitializeImageType<2>();
21   InitializeImageType<3>();  
22   InitializeImageType<4>();  
23 }
24 //--------------------------------------------------------------------
25
26
27 //--------------------------------------------------------------------
28 template<unsigned int Dim>
29 void clitk::ImageConvertGenericFilter::InitializeImageType() {      
30   ADD_IMAGE_TYPE(Dim, char);
31   ADD_IMAGE_TYPE(Dim, short);
32   ADD_IMAGE_TYPE(Dim, unsigned short);
33   ADD_IMAGE_TYPE(Dim, int);
34   ADD_IMAGE_TYPE(Dim, float);
35   ADD_IMAGE_TYPE(Dim, double);
36 }
37 //--------------------------------------------------------------------
38
39
40 //--------------------------------------------------------------------
41 template<class InputImageType>
42 void clitk::ImageConvertGenericFilter::UpdateWithInputImageType() {
43
44   // Verbose stuff
45   if (mIOVerbose) {
46     if (mInputFilenames.size() == 1) {
47       std::cout << "Input image <" << mInputFilenames[0] << "> is ";
48       itk::ImageIOBase::Pointer header = clitk::readImageHeader(mInputFilenames[0]);
49       printImageHeader(header, std::cout);
50       std::cout << std::endl;
51     }
52     else {
53       for(unsigned int i=0; i<mInputFilenames.size(); i++) {
54         std::cout << "Input image " << i << " <" << mInputFilenames[i] << "> is ";
55         itk::ImageIOBase::Pointer h = clitk::readImageHeader(mInputFilenames[i]);       
56         printImageHeader(h, std::cout);
57         std::cout << std::endl;
58       }
59     }
60   }
61
62
63   if ((mPixelTypeName == mOutputPixelTypeName) || (mOutputPixelTypeName == "NotSpecified")) {
64     //    typename InputImageType::Pointer input = clitk::readImage<InputImageType>(mInputFilenames);
65     typename InputImageType::Pointer input = this->template GetInput<InputImageType>(0);
66     //clitk::writeImage<InputImageType>(input, mOutputFilename, mIOVerbose);
67     this->SetNextOutput<InputImageType>(input);
68   }
69   else {
70 #define TRY_TYPE(TYPE) \
71     if (IsSameType<TYPE>(mOutputPixelTypeName)) { UpdateWithOutputType<InputImageType, TYPE>(); return; }
72     TRY_TYPE(char);
73     // TRY_TYPE(signed char);
74     TRY_TYPE(uchar);
75     TRY_TYPE(short);
76     TRY_TYPE(ushort);
77     TRY_TYPE(int); // no uint ...
78     TRY_TYPE(float);
79     TRY_TYPE(double);
80 #undef TRY_TYPE
81
82     std::string list = CreateListOfTypes<char, uchar, short, ushort, int, float, double>();
83     std::cerr << "Error, I don't know the output type '" << mOutputPixelTypeName 
84               << "'. " << std::endl << "Known types are " << list << "." << std::endl;
85     exit(0);
86   }  
87 }
88 //====================================================================
89
90 //====================================================================
91 template<class InputImageType, class OutputPixelType>
92 void clitk::ImageConvertGenericFilter::UpdateWithOutputType() {
93   // Read
94   typename InputImageType::Pointer input =this->template GetInput<InputImageType>(0);
95
96   // Typedef
97   typedef typename InputImageType::PixelType PixelType;
98
99   // Warning
100   if (std::numeric_limits<PixelType>::is_signed) {
101     if (!std::numeric_limits<OutputPixelType>::is_signed) {
102       std::cerr << "Warning, input type is signed (" << mPixelTypeName << ") while output type is not (" 
103                 << mOutputPixelTypeName << "), use at your own responsability." << std::endl;
104     }
105   }
106   if (!std::numeric_limits<PixelType>::is_integer) {
107     if (std::numeric_limits<OutputPixelType>::is_integer) {
108       std::cerr << "Warning, input type is not integer (" << mPixelTypeName << ") while output type is (" 
109                 << mOutputPixelTypeName << "), use at your own responsability." << std::endl;
110     }
111   }
112   //  DD(std::numeric_limits<PixelType>::digits10);
113   // DD(std::numeric_limits<OutputPixelType>::digits10);
114   if (!std::numeric_limits<PixelType>::is_integer) {
115     if (std::numeric_limits<OutputPixelType>::is_integer) {
116       std::cerr << "Warning, input type is not integer (" << mPixelTypeName << ") while output type is (" 
117                 << mOutputPixelTypeName << "), use at your own responsability." << std::endl;
118     }
119   }
120   if (std::numeric_limits<PixelType>::digits10 > std::numeric_limits<OutputPixelType>::digits10) {
121     std::cerr << "Warning, possible loss of precision : input type is (" << mPixelTypeName << ") while output type is (" 
122                 << mOutputPixelTypeName << "), use at your own responsability." << std::endl;
123   }
124
125   // Cast
126   typedef itk::Image<OutputPixelType,InputImageType::ImageDimension> OutputImageType;
127   typedef itk::CastImageFilter<InputImageType, OutputImageType> FilterType;
128   typename FilterType::Pointer filter = FilterType::New();
129   filter->SetInput(input);
130   filter->Update();
131
132   // Write
133   SetNextOutput<OutputImageType>(filter->GetOutput());
134   //clitk::writeImage<OutputImageType>(filter->GetOutput(), mOutputFilename, mIOVerbose);
135 }
136 //====================================================================
137
138
139 #endif /* end #define CLITKIMAGECONVERTGENERICFILTER_CXX */
140