00001 /*========================================================================= 00002 00003 Program: Medical Imaging & Interaction Toolkit 00004 Language: C++ 00005 Date: $Date$ 00006 Version: $Revision$ 00007 00008 Copyright (c) German Cancer Research Center, Division of Medical and 00009 Biological Informatics. All rights reserved. 00010 See MITKCopyright.txt or https://www.mitk.org/copyright.html for details. 00011 00012 This software is distributed WITHOUT ANY WARRANTY; without even 00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00014 PURPOSE. See the above copyright notices for more information. 00015 00016 =========================================================================*/ 00017 00018 00019 #include "mitkItkPictureWrite.h" 00020 #include "mitkImageAccessByItk.h" 00021 00022 #include <itkNumericSeriesFileNames.h> 00023 #include <itkImageSeriesWriter.h> 00024 #include <itkRescaleIntensityImageFilter.h> 00025 00026 template < typename TPixel, unsigned int VImageDimension > 00027 void _mitkItkPictureWrite(itk::Image< TPixel, VImageDimension >* itkImage, const std::string& fileName) 00028 { 00029 typedef itk::Image< TPixel, VImageDimension > TImageType; 00030 00031 typedef itk::Image<unsigned char,3> OutputImage3DType; 00032 typedef itk::Image<unsigned char,2> OutputImage2DType; 00033 typename itk::RescaleIntensityImageFilter<TImageType, OutputImage3DType>::Pointer rescaler = itk::RescaleIntensityImageFilter<TImageType, OutputImage3DType>::New(); 00034 rescaler->SetInput(itkImage); 00035 rescaler->SetOutputMinimum(0); 00036 rescaler->SetOutputMaximum(255); 00037 itk::NumericSeriesFileNames::Pointer numericFileNameWriter = itk::NumericSeriesFileNames::New(); 00038 itk::ImageSeriesWriter<OutputImage3DType, OutputImage2DType>::Pointer writer = itk::ImageSeriesWriter<OutputImage3DType, OutputImage2DType >::New(); 00039 00040 int numberOfSlices = itkImage->GetLargestPossibleRegion().GetSize()[2]; 00041 std::string finalFileName = fileName; 00042 std::string::size_type pos = fileName.find_last_of(".",fileName.length()-1); 00043 if(pos==std::string::npos) 00044 finalFileName.append(".%d.png"); 00045 else 00046 finalFileName.insert(pos,".%d"); 00047 00048 numericFileNameWriter->SetEndIndex(numberOfSlices); 00049 numericFileNameWriter->SetSeriesFormat(finalFileName.c_str()); 00050 numericFileNameWriter->Modified(); 00051 00052 writer->SetInput( rescaler->GetOutput() ); 00053 writer->SetFileNames(numericFileNameWriter->GetFileNames()); 00054 writer->Update(); 00055 } 00056 00057 InstantiateAccessFunction_1(_mitkItkPictureWrite, const std::string&); 00058 00059 // typedef itk::Image<itk::RGBPixel<unsigned char>, 2> itkImageRGBUC2; 00060 // template <> void _mitkItkImageWrite<itk::RGBPixel<unsigned char>, 2>(itkImageRGBUC2* itkImage, const std::string& fileName) 00061 // { 00062 // typedef itkImageRGBUC2 TImageType; 00063 // 00064 // itk::ImageFileWriter<TImageType>::Pointer writer = itk::ImageFileWriter<TImageType>::New(); 00065 // writer->SetInput( itkImage ); 00066 // writer->SetFileName( fileName.c_str() ); 00067 // writer->Update(); 00068 // }; 00069 // 00070 // typedef itk::Image<itk::RGBPixel<unsigned char>, 3> itkImageRGBUC3; 00071 // template <> void _mitkItkImageWrite<itk::RGBPixel<unsigned char>, 3>(itkImageRGBUC3* itkImage, const std::string& fileName) 00072 // { 00073 // typedef itkImageRGBUC3 TImageType; 00074 // 00075 // itk::ImageFileWriter<TImageType>::Pointer writer = itk::ImageFileWriter<TImageType>::New(); 00076 // writer->SetInput( itkImage ); 00077 // writer->SetFileName( fileName.c_str() ); 00078 // writer->Update(); 00079 // }; 00080 // 00081 // typedef itk::Image<itk::DiffusionTensor3D<float>, 3> itkImageDTIF3; 00082 // template <> void _mitkItkImageWrite<itk::DiffusionTensor3D<float>, 3>(itkImageDTIF3* itkImage, const std::string& fileName) 00083 // { 00084 // typedef itkImageDTIF3 TImageType; 00085 // 00086 // itk::ImageFileWriter<TImageType>::Pointer writer = itk::ImageFileWriter<TImageType>::New(); 00087 // writer->SetInput( itkImage ); 00088 // writer->SetFileName( fileName.c_str() ); 00089 // writer->Update(); 00090 // }; 00091 // 00092 // typedef itk::Image<itk::DiffusionTensor3D<double>, 3> itkImageDTID3; 00093 // template <> void _mitkItkImageWrite<itk::DiffusionTensor3D<double>, 3>(itkImageDTID3* itkImage, const std::string& fileName) 00094 // { 00095 // typedef itkImageDTID3 TImageType; 00096 // 00097 // itk::ImageFileWriter<TImageType>::Pointer writer = itk::ImageFileWriter<TImageType>::New(); 00098 // writer->SetInput( itkImage ); 00099 // writer->SetFileName( fileName.c_str() ); 00100 // writer->Update(); 00101 // }; 00102 // 00103 // typedef itk::Image<itk::DiffusionTensor3D<float>, 2> itkImageDTIF2; 00104 // template <> void _mitkItkImageWrite<itk::DiffusionTensor3D<float>, 2>(itkImageDTIF2* itkImage, const std::string& fileName) 00105 // { 00106 // typedef itkImageDTIF2 TImageType; 00107 // 00108 // itk::ImageFileWriter<TImageType>::Pointer writer = itk::ImageFileWriter<TImageType>::New(); 00109 // writer->SetInput( itkImage ); 00110 // writer->SetFileName( fileName.c_str() ); 00111 // writer->Update(); 00112 // }; 00113 // 00114 // typedef itk::Image<itk::DiffusionTensor3D<double>, 2> itkImageDTID2; 00115 // template <> void _mitkItkImageWrite<itk::DiffusionTensor3D<double>, 2>(itkImageDTID2* itkImage, const std::string& fileName) 00116 // { 00117 // typedef itkImageDTID2 TImageType; 00118 // 00119 // itk::ImageFileWriter<TImageType>::Pointer writer = itk::ImageFileWriter<TImageType>::New(); 00120 // writer->SetInput( itkImage ); 00121 // writer->SetFileName( fileName.c_str() ); 00122 // writer->Update(); 00123 // }; 00124 00125