#ifndef CLITKIMAGECONVERTGENERICFILTER_CXX #define CLITKIMAGECONVERTGENERICFILTER_CXX /** ------------------------------------------------- * @file clitkImageConvertGenericFilter.cxx * @author David Sarrut * @date 05 May 2008 10:57:19 * * @brief * * -------------------------------------------------*/ #include "clitkImageConvertGenericFilter.h" //-------------------------------------------------------------------- clitk::ImageConvertGenericFilter::ImageConvertGenericFilter(): clitk::ImageToImageGenericFilter("ImageConvert") { mOutputPixelTypeName = "NotSpecified"; InitializeImageType<2>(); InitializeImageType<3>(); InitializeImageType<4>(); } //-------------------------------------------------------------------- //-------------------------------------------------------------------- template void clitk::ImageConvertGenericFilter::InitializeImageType() { ADD_IMAGE_TYPE(Dim, char); ADD_IMAGE_TYPE(Dim, short); ADD_IMAGE_TYPE(Dim, unsigned short); ADD_IMAGE_TYPE(Dim, int); ADD_IMAGE_TYPE(Dim, float); ADD_IMAGE_TYPE(Dim, double); } //-------------------------------------------------------------------- //-------------------------------------------------------------------- template void clitk::ImageConvertGenericFilter::UpdateWithInputImageType() { // Verbose stuff if (mIOVerbose) { if (mInputFilenames.size() == 1) { std::cout << "Input image <" << mInputFilenames[0] << "> is "; itk::ImageIOBase::Pointer header = clitk::readImageHeader(mInputFilenames[0]); printImageHeader(header, std::cout); std::cout << std::endl; } else { for(unsigned int i=0; i is "; itk::ImageIOBase::Pointer h = clitk::readImageHeader(mInputFilenames[i]); printImageHeader(h, std::cout); std::cout << std::endl; } } } if ((mPixelTypeName == mOutputPixelTypeName) || (mOutputPixelTypeName == "NotSpecified")) { // typename InputImageType::Pointer input = clitk::readImage(mInputFilenames); typename InputImageType::Pointer input = this->template GetInput(0); //clitk::writeImage(input, mOutputFilename, mIOVerbose); this->SetNextOutput(input); } else { #define TRY_TYPE(TYPE) \ if (IsSameType(mOutputPixelTypeName)) { UpdateWithOutputType(); return; } TRY_TYPE(char); // TRY_TYPE(signed char); TRY_TYPE(uchar); TRY_TYPE(short); TRY_TYPE(ushort); TRY_TYPE(int); // no uint ... TRY_TYPE(float); TRY_TYPE(double); #undef TRY_TYPE std::string list = CreateListOfTypes(); std::cerr << "Error, I don't know the output type '" << mOutputPixelTypeName << "'. " << std::endl << "Known types are " << list << "." << std::endl; exit(0); } } //==================================================================== //==================================================================== template void clitk::ImageConvertGenericFilter::UpdateWithOutputType() { // Read typename InputImageType::Pointer input =this->template GetInput(0); // Typedef typedef typename InputImageType::PixelType PixelType; // Warning if (std::numeric_limits::is_signed) { if (!std::numeric_limits::is_signed) { std::cerr << "Warning, input type is signed (" << mPixelTypeName << ") while output type is not (" << mOutputPixelTypeName << "), use at your own responsability." << std::endl; } } if (!std::numeric_limits::is_integer) { if (std::numeric_limits::is_integer) { std::cerr << "Warning, input type is not integer (" << mPixelTypeName << ") while output type is (" << mOutputPixelTypeName << "), use at your own responsability." << std::endl; } } // DD(std::numeric_limits::digits10); // DD(std::numeric_limits::digits10); if (!std::numeric_limits::is_integer) { if (std::numeric_limits::is_integer) { std::cerr << "Warning, input type is not integer (" << mPixelTypeName << ") while output type is (" << mOutputPixelTypeName << "), use at your own responsability." << std::endl; } } if (std::numeric_limits::digits10 > std::numeric_limits::digits10) { std::cerr << "Warning, possible loss of precision : input type is (" << mPixelTypeName << ") while output type is (" << mOutputPixelTypeName << "), use at your own responsability." << std::endl; } // Cast typedef itk::Image OutputImageType; typedef itk::CastImageFilter FilterType; typename FilterType::Pointer filter = FilterType::New(); filter->SetInput(input); filter->Update(); // Write SetNextOutput(filter->GetOutput()); //clitk::writeImage(filter->GetOutput(), mOutputFilename, mIOVerbose); } //==================================================================== #endif /* end #define CLITKIMAGECONVERTGENERICFILTER_CXX */