#if defined(_MSC_VER) #pragma warning ( disable : 4786 ) #endif #ifdef __BORLANDC__ #define ITK_LEAN_AND_MEAN #endif // include reader/write related headers #include "itkImageFileReader.h" #include "itkImageFileWriter.h" // include input/output images explicit types #include "itkGDCMImageIO.h" // include writing series facilities //#include "itkGDCMSeriesFileNames.h" #include "itkNumericSeriesFileNames.h" #include "itkImageSeriesWriter.h" // include image related headers #include "itkImage.h" // include itk system tools #include int main( int argc, char ** argv ) { // verify the number of parameters in the command line if( argc < 3 ) { std::cerr << "Usage: " << std::endl; std::cerr << argv[0] << " inputImageFile outputDicomDirectory " << std::endl; return EXIT_FAILURE; } // image charcteristics we are working on typedef short PixelType; const unsigned int Dimension = 3; typedef itk::Image< PixelType, Dimension > ImageType; // the way we read input nrrd files typedef itk::ImageFileReader< ImageType > ReaderType; ReaderType::Pointer reader = ReaderType::New(); const char *inputFilename = argv[1]; reader->SetFileName( inputFilename ); try { // run the conversion pipeline reader->Update(); } catch( itk::ExceptionObject & err ) { std::cerr << "ExceptionObject caught !" << std::endl; std::cerr << err << std::endl; return EXIT_FAILURE; } // the way we write down dicom series const unsigned int OutputDimension = 2; typedef itk::Image< PixelType, OutputDimension > Image2DType; typedef itk::ImageSeriesWriter< ImageType, Image2DType > SeriesWriterType; typedef itk::GDCMImageIO OutputImageType; const char *outputDirectory = argv[2]; itksys::SystemTools::MakeDirectory( outputDirectory ); // typedef itk::DICOMSeriesFileNames NamesGeneratorType; typedef itk::NumericSeriesFileNames NamesGeneratorType; NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New(); ImageType::RegionType region = reader->GetOutput()->GetLargestPossibleRegion(); ImageType::IndexType start = region.GetIndex(); ImageType::SizeType size = region.GetSize(); std::string format = outputDirectory; format += "\\slice#%03d.dcm"; namesGenerator->SetSeriesFormat( format.c_str() ); namesGenerator->SetStartIndex( start[2] ); namesGenerator->SetEndIndex( start[2] + size[2] - 1 ); namesGenerator->SetIncrementIndex( 1 ); // typedef itk::GDCMSeriesFileNames NamesGeneratorType; // NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New(); // namesGenerator->SetOutputDirectory( outputDirectory ); SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New(); seriesWriter->SetFileNames( namesGenerator->GetFileNames() ); OutputImageType::Pointer outputImage = OutputImageType::New(); seriesWriter->SetImageIO( outputImage ); // set up the conversion pipeline // input-file -> reader | writer -> output-file-serie seriesWriter->SetInput( reader->GetOutput() ); seriesWriter->SetMetaDataDictionary( reader->GetMetaDataDictionary() ); try { // run the conversion pipeline seriesWriter->Update(); } catch( itk::ExceptionObject & err ) { std::cerr << "ExceptionObject caught !" << std::endl; std::cerr << err << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; }