diff --git a/Core/Code/IO/mitkItkPictureWrite.cpp b/Core/Code/IO/mitkItkPictureWrite.cpp index 5a986176a0..0712f9dfb5 100644 --- a/Core/Code/IO/mitkItkPictureWrite.cpp +++ b/Core/Code/IO/mitkItkPictureWrite.cpp @@ -1,140 +1,167 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkItkPictureWrite.h" #include #include #include #include +#include + template < typename TPixel, unsigned int VImageDimension > void _mitkItkPictureWrite(itk::Image< TPixel, VImageDimension >* itkImage, const std::string& fileName) { typedef itk::Image< TPixel, VImageDimension > TImageType; typedef itk::Image OutputImage3DType; typedef itk::Image OutputImage2DType; typename itk::RescaleIntensityImageFilter::Pointer rescaler = itk::RescaleIntensityImageFilter::New(); rescaler->SetInput(itkImage); rescaler->SetOutputMinimum(0); rescaler->SetOutputMaximum(255); itk::ImageSeriesWriter::Pointer writer = itk::ImageSeriesWriter::New(); // Fix initialize the numberOfSlices to one as default // test if image has dimension >2 to set the number of slices according to the value of GetSize()[2] int numberOfSlices = 1; if( VImageDimension > 2 ) { itk::NumericSeriesFileNames::Pointer numericFileNameWriter = itk::NumericSeriesFileNames::New(); numberOfSlices = itkImage->GetLargestPossibleRegion().GetSize()[2]; std::string finalFileName = fileName; std::string::size_type pos = fileName.find_last_of(".",fileName.length()-1); if(pos==std::string::npos) finalFileName.append(".%d.png"); else finalFileName.insert(pos,".%d"); numericFileNameWriter->SetEndIndex(numberOfSlices); numericFileNameWriter->SetSeriesFormat(finalFileName.c_str()); numericFileNameWriter->Modified(); writer->SetFileNames(numericFileNameWriter->GetFileNames()); } // if the given image is an 2D-png image, do not use the numericFileNameWriter // to generate the name, since it alters the fileName given as parameter else { writer->SetFileName(fileName); } writer->SetInput( rescaler->GetOutput() ); writer->Update(); } +template < typename TPixel, unsigned int VImageDimension > +void _mitkItkPictureWriteComposite(itk::Image< TPixel, VImageDimension >* itkImage, const std::string& fileName) +{ + typedef itk::Image< TPixel, VImageDimension > TImageType; + + typedef itk::ImageFileWriter< TImageType > WriterType; + typename WriterType::Pointer simpleWriter = WriterType::New(); + + simpleWriter->SetFileName( fileName ); + simpleWriter->SetInput( itkImage ); + try + { + simpleWriter->Update(); + } + catch( itk::ExceptionObject &e) + { + std::cerr << "Caught exception while writing image with composite type: \n" << e.what(); + } +} + #define InstantiateAccessFunction__mitkItkPictureWrite(pixelType, dim) \ template MITK_CORE_EXPORT void _mitkItkPictureWrite(itk::Image*, const std::string&); +#define InstantiateAccessFunction__mitkItkPictureWriteComposite(pixelType, dim) \ + template MITK_CORE_EXPORT void _mitkItkPictureWriteComposite(itk::Image*, const std::string&); + InstantiateAccessFunction(_mitkItkPictureWrite) +InstantiateAccessFunctionForFixedPixelType( _mitkItkPictureWriteComposite, MITK_ACCESSBYITK_PIXEL_TYPES_SEQ MITK_ACCESSBYITK_COMPOSITE_PIXEL_TYPES_SEQ) + // typedef itk::Image, 2> itkImageRGBUC2; // template <> void _mitkItkImageWrite, 2>(itkImageRGBUC2* itkImage, const std::string& fileName) // { // typedef itkImageRGBUC2 TImageType; // // itk::ImageFileWriter::Pointer writer = itk::ImageFileWriter::New(); // writer->SetInput( itkImage ); // writer->SetFileName( fileName.c_str() ); // writer->Update(); // }; // // typedef itk::Image, 3> itkImageRGBUC3; // template <> void _mitkItkImageWrite, 3>(itkImageRGBUC3* itkImage, const std::string& fileName) // { // typedef itkImageRGBUC3 TImageType; // // itk::ImageFileWriter::Pointer writer = itk::ImageFileWriter::New(); // writer->SetInput( itkImage ); // writer->SetFileName( fileName.c_str() ); // writer->Update(); // }; // // typedef itk::Image, 3> itkImageDTIF3; // template <> void _mitkItkImageWrite, 3>(itkImageDTIF3* itkImage, const std::string& fileName) // { // typedef itkImageDTIF3 TImageType; // // itk::ImageFileWriter::Pointer writer = itk::ImageFileWriter::New(); // writer->SetInput( itkImage ); // writer->SetFileName( fileName.c_str() ); // writer->Update(); // }; // // typedef itk::Image, 3> itkImageDTID3; // template <> void _mitkItkImageWrite, 3>(itkImageDTID3* itkImage, const std::string& fileName) // { // typedef itkImageDTID3 TImageType; // // itk::ImageFileWriter::Pointer writer = itk::ImageFileWriter::New(); // writer->SetInput( itkImage ); // writer->SetFileName( fileName.c_str() ); // writer->Update(); // }; // // typedef itk::Image, 2> itkImageDTIF2; // template <> void _mitkItkImageWrite, 2>(itkImageDTIF2* itkImage, const std::string& fileName) // { // typedef itkImageDTIF2 TImageType; // // itk::ImageFileWriter::Pointer writer = itk::ImageFileWriter::New(); // writer->SetInput( itkImage ); // writer->SetFileName( fileName.c_str() ); // writer->Update(); // }; // // typedef itk::Image, 2> itkImageDTID2; // template <> void _mitkItkImageWrite, 2>(itkImageDTID2* itkImage, const std::string& fileName) // { // typedef itkImageDTID2 TImageType; // // itk::ImageFileWriter::Pointer writer = itk::ImageFileWriter::New(); // writer->SetInput( itkImage ); // writer->SetFileName( fileName.c_str() ); // writer->Update(); // }; diff --git a/Core/Code/IO/mitkItkPictureWrite.h b/Core/Code/IO/mitkItkPictureWrite.h index 3d18a3a8ea..15ab43a0f1 100644 --- a/Core/Code/IO/mitkItkPictureWrite.h +++ b/Core/Code/IO/mitkItkPictureWrite.h @@ -1,26 +1,40 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ +/** @file mitkItkPictureWrite.h */ #ifndef MITKITKPICTUREWRITE_H #define MITKITKPICTUREWRITE_H - #include +#include +/** + * @brief ITK-Like method to be called for writing an single-component image using the AccessByItk Macros + * + * @param itkImage an image with single-component pixel type + */ template < typename TPixel, unsigned int VImageDimension > void _mitkItkPictureWrite(itk::Image< TPixel, VImageDimension >* itkImage, const std::string& fileName); +/** + * @brief ITK-Like method to be called for writing an image + * + * @param itkImage an Image with single-component or composite pixel type + */ +template < typename TPixel, unsigned int VImageDimension > +void _mitkItkPictureWriteComposite(itk::Image< TPixel, VImageDimension >* itkImage, const std::string& fileName); + #endif /* MITKITKPICTUREWRITE_H */