1 #ifndef CLITKIMAGECONVERTGENERICFILTER_CXX
2 #define CLITKIMAGECONVERTGENERICFILTER_CXX
5 -------------------------------------------------
6 * @file clitkImageConvertGenericFilter.cxx
7 * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
8 * @date 05 May 2008 10:57:19
13 -------------------------------------------------*/
15 #include "clitkImageConvertGenericFilter.h"
17 //--------------------------------------------------------------------
18 clitk::ImageConvertGenericFilter::ImageConvertGenericFilter():
19 clitk::ImageToImageGenericFilter<Self>("ImageConvert") {
20 mOutputPixelTypeName = "NotSpecified";
21 InitializeImageType<2>();
22 InitializeImageType<3>();
23 InitializeImageType<4>();
25 //--------------------------------------------------------------------
28 //--------------------------------------------------------------------
29 template<unsigned int Dim>
30 void clitk::ImageConvertGenericFilter::InitializeImageType() {
31 ADD_IMAGE_TYPE(Dim, char);
32 ADD_IMAGE_TYPE(Dim, short);
33 ADD_IMAGE_TYPE(Dim, unsigned short);
34 ADD_IMAGE_TYPE(Dim, int);
35 ADD_IMAGE_TYPE(Dim, float);
36 ADD_IMAGE_TYPE(Dim, double);
38 //--------------------------------------------------------------------
41 //--------------------------------------------------------------------
42 template<class InputImageType>
43 void clitk::ImageConvertGenericFilter::UpdateWithInputImageType() {
47 if (mInputFilenames.size() == 1) {
48 std::cout << "Input image <" << mInputFilenames[0] << "> is ";
49 itk::ImageIOBase::Pointer header = clitk::readImageHeader(mInputFilenames[0]);
50 printImageHeader(header, std::cout);
51 std::cout << std::endl;
54 for(unsigned int i=0; i<mInputFilenames.size(); i++) {
55 std::cout << "Input image " << i << " <" << mInputFilenames[i] << "> is ";
56 itk::ImageIOBase::Pointer h = clitk::readImageHeader(mInputFilenames[i]);
57 printImageHeader(h, std::cout);
58 std::cout << std::endl;
64 if ((mPixelTypeName == mOutputPixelTypeName) || (mOutputPixelTypeName == "NotSpecified")) {
65 // typename InputImageType::Pointer input = clitk::readImage<InputImageType>(mInputFilenames);
66 typename InputImageType::Pointer input = this->template GetInput<InputImageType>(0);
67 //clitk::writeImage<InputImageType>(input, mOutputFilename, mIOVerbose);
68 this->SetNextOutput<InputImageType>(input);
71 #define TRY_TYPE(TYPE) \
72 if (IsSameType<TYPE>(mOutputPixelTypeName)) { UpdateWithOutputType<InputImageType, TYPE>(); return; }
74 // TRY_TYPE(signed char);
78 TRY_TYPE(int); // no uint ...
83 std::string list = CreateListOfTypes<char, uchar, short, ushort, int, float, double>();
84 std::cerr << "Error, I don't know the output type '" << mOutputPixelTypeName
85 << "'. " << std::endl << "Known types are " << list << "." << std::endl;
89 //====================================================================
91 //====================================================================
92 template<class InputImageType, class OutputPixelType>
93 void clitk::ImageConvertGenericFilter::UpdateWithOutputType() {
95 typename InputImageType::Pointer input =this->template GetInput<InputImageType>(0);
98 typedef typename InputImageType::PixelType PixelType;
101 if (std::numeric_limits<PixelType>::is_signed) {
102 if (!std::numeric_limits<OutputPixelType>::is_signed) {
103 std::cerr << "Warning, input type is signed (" << mPixelTypeName << ") while output type is not ("
104 << mOutputPixelTypeName << "), use at your own responsability." << std::endl;
107 if (!std::numeric_limits<PixelType>::is_integer) {
108 if (std::numeric_limits<OutputPixelType>::is_integer) {
109 std::cerr << "Warning, input type is not integer (" << mPixelTypeName << ") while output type is ("
110 << mOutputPixelTypeName << "), use at your own responsability." << std::endl;
113 // DD(std::numeric_limits<PixelType>::digits10);
114 // DD(std::numeric_limits<OutputPixelType>::digits10);
115 if (!std::numeric_limits<PixelType>::is_integer) {
116 if (std::numeric_limits<OutputPixelType>::is_integer) {
117 std::cerr << "Warning, input type is not integer (" << mPixelTypeName << ") while output type is ("
118 << mOutputPixelTypeName << "), use at your own responsability." << std::endl;
121 if (std::numeric_limits<PixelType>::digits10 > std::numeric_limits<OutputPixelType>::digits10) {
122 std::cerr << "Warning, possible loss of precision : input type is (" << mPixelTypeName << ") while output type is ("
123 << mOutputPixelTypeName << "), use at your own responsability." << std::endl;
127 typedef itk::Image<OutputPixelType,InputImageType::ImageDimension> OutputImageType;
128 typedef itk::CastImageFilter<InputImageType, OutputImageType> FilterType;
129 typename FilterType::Pointer filter = FilterType::New();
130 filter->SetInput(input);
134 SetNextOutput<OutputImageType>(filter->GetOutput());
135 //clitk::writeImage<OutputImageType>(filter->GetOutput(), mOutputFilename, mIOVerbose);
137 //====================================================================
140 #endif /* end #define CLITKIMAGECONVERTGENERICFILTER_CXX */