1 #ifndef clitkWriteDicomSeriesGenericFilter_txx
2 #define clitkWriteDicomSeriesGenericFilter_txx
4 /* =================================================
5 * @file clitkWriteDicomSeriesGenericFilter.txx
11 ===================================================*/
18 //-----------------------------------------------------------
20 //-----------------------------------------------------------
21 template<class args_info_type>
22 WriteDicomSeriesGenericFilter<args_info_type>::WriteDicomSeriesGenericFilter()
29 //-----------------------------------------------------------
31 //-----------------------------------------------------------
32 template<class args_info_type>
33 void WriteDicomSeriesGenericFilter<args_info_type>::Update()
35 // Read the Dimension and PixelType
37 std::string PixelType;
38 ReadImageDimensionAndPixelType(m_InputFileName, Dimension, PixelType);
42 if(Dimension==2) UpdateWithDim<2>(PixelType);
43 else if(Dimension==3) UpdateWithDim<3>(PixelType);
44 // else if (Dimension==4)UpdateWithDim<4>(PixelType);
47 std::cout<<"Error, Only for 2 or 3 Dimensions!!!"<<std::endl ;
52 //-------------------------------------------------------------------
53 // Update with the number of dimensions
54 //-------------------------------------------------------------------
55 template<class args_info_type>
56 template<unsigned int Dimension>
58 WriteDicomSeriesGenericFilter<args_info_type>::UpdateWithDim(std::string PixelType)
60 if (m_Verbose) std::cout << "Image was detected to be "<<Dimension<<"D and "<< PixelType<<"..."<<std::endl;
62 if(PixelType == "short"){
63 if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed short..." << std::endl;
64 UpdateWithDimAndPixelType<Dimension, signed short>();
66 // else if(PixelType == "unsigned_short"){
67 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl;
68 // UpdateWithDimAndPixelType<Dimension, unsigned short>();
71 else if (PixelType == "unsigned_char"){
72 if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl;
73 UpdateWithDimAndPixelType<Dimension, unsigned char>();
76 // else if (PixelType == "char"){
77 // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl;
78 // UpdateWithDimAndPixelType<Dimension, signed char>();
81 if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and float..." << std::endl;
82 UpdateWithDimAndPixelType<Dimension, float>();
87 //-------------------------------------------------------------------
88 // Update with the number of dimensions and the pixeltype
89 //-------------------------------------------------------------------
90 template<class args_info_type>
91 template <unsigned int Dimension, class PixelType>
93 WriteDicomSeriesGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
97 typedef itk::Image<PixelType, Dimension> InputImageType;
98 typedef itk::Image<PixelType, 2> OutputImageType;
100 // Read the input (volumetric)
101 typedef itk::ImageFileReader<InputImageType> InputReaderType;
102 typename InputReaderType::Pointer volumeReader = InputReaderType::New();
103 volumeReader->SetFileName( m_InputFileName);
104 volumeReader->Update();
105 typename InputImageType::Pointer input= volumeReader->GetOutput();
107 // Read the dicom directory
108 typedef itk::ImageSeriesReader< InputImageType > ReaderType;
109 typedef itk::GDCMImageIO ImageIOType;
110 typedef itk::GDCMSeriesFileNames NamesGeneratorType;
112 ImageIOType::Pointer gdcmIO = ImageIOType::New();
113 NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
114 namesGenerator->SetInputDirectory( m_ArgsInfo.inputDir_arg );
115 typename ReaderType::FileNamesContainer filenames = namesGenerator->GetInputFileNames();
117 // Output the dicom files
118 unsigned int numberOfFilenames = filenames.size();
121 std::cout << numberOfFilenames <<" were read in the directory "<<m_ArgsInfo.inputDir_arg<<"..."<<std::endl<<std::endl;
122 for(unsigned int fni = 0; fni<numberOfFilenames; fni++)
124 std::cout << "filename # " << fni << " = ";
125 std::cout << filenames[fni] << std::endl;
130 typename ReaderType::Pointer reader = ReaderType::New();
131 reader->SetImageIO( gdcmIO );
132 reader->SetFileNames( filenames );
137 catch (itk::ExceptionObject &excp)
139 std::cerr << "Error: Exception thrown while writing the DICOM series!!" << std::endl;
140 std::cerr << excp << std::endl;
144 // Modify the meta dictionary
145 typedef itk::MetaDataDictionary DictionaryType;
146 const std::vector<DictionaryType*>* dictionary = reader->GetMetaDataDictionaryArray();
149 unsigned int numberOfKeysGiven=0;
150 if(m_ArgsInfo.midP_flag && m_ArgsInfo.key_given)
151 std::cerr<<"Error: both keys and midP option are given"<<std::endl;
152 else if (m_ArgsInfo.midP_flag)
155 numberOfKeysGiven=m_ArgsInfo.key_given;
157 for (unsigned int i = 0; i < numberOfKeysGiven; i++)
159 std::string entryId(m_ArgsInfo.key_arg[i] );
160 std::string value( m_ArgsInfo.tag_arg[i] );
161 for(unsigned int fni = 0; fni<numberOfFilenames; fni++)
162 itk::EncapsulateMetaData<std::string>( *((*dictionary)[fni]), entryId, value );
165 // Output directory and filenames
166 itksys::SystemTools::MakeDirectory( m_ArgsInfo.outputDir_arg ); // create if it doesn't exist
167 typedef itk::ImageSeriesWriter<InputImageType, OutputImageType > SeriesWriterType;
168 typename SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
170 seriesWriter->SetInput( volumeReader->GetOutput() );
171 seriesWriter->SetImageIO( gdcmIO );
172 namesGenerator->SetOutputDirectory( m_ArgsInfo.outputDir_arg );
173 seriesWriter->SetFileNames( namesGenerator->GetOutputFileNames() );
174 //seriesWriter->SetMetaDataDictionaryArray( dictionary );
175 seriesWriter->SetMetaDataDictionaryArray( dictionary );
180 seriesWriter->Update();
182 catch( itk::ExceptionObject & excp )
184 std::cerr << "Error: Exception thrown while writing the series!!" << std::endl;
185 std::cerr << excp << std::endl;
193 #endif //#define clitkWriteDicomSeriesGenericFilter_txx