]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/Plugins/ImageWriter.cxx
Basic IO architecture within itk-based pipelines
[cpPlugins.git] / lib / cpPlugins / Plugins / ImageWriter.cxx
1 #include <cpPlugins/Plugins/ImageWriter.h>
2
3 // TODO: interesting... #define ITK_MANUAL_INSTANTIATION
4 #include <itkImage.h>
5 #include <itkImageFileWriter.h>
6 #include <itkRGBPixel.h>
7
8 // -------------------------------------------------------------------------
9 #define cpPlugins_Plugins_ImageWriter_Dimension( ret, d, dobj, func )   \
10   if( dynamic_cast< itk::ImageBase< d >* >( dobj ) != NULL )            \
11     ret = this->func< d >( )
12
13 // -------------------------------------------------------------------------
14 #define cpPlugins_Plugins_ImageWriter_Pixel( ret, p, d, dobj, func )    \
15   if( dynamic_cast< itk::Image< p, d >* >( dobj ) != NULL )             \
16     ret = this->func< p, d >( )
17
18 // -------------------------------------------------------------------------
19 #define cpPlugins_Plugins_ImageWriter_RGB( ret, p, d, dobj, func )      \
20   if( dynamic_cast< itk::Image< itk::RGBPixel< p >, d >* >( dobj ) != NULL ) \
21     ret = this->func< itk::RGBPixel< p >, d >( )
22
23 // -------------------------------------------------------------------------
24 cpPlugins::Plugins::ImageWriter::
25 ImageWriter( )
26   : Superclass( )
27 {
28   this->SetNumberOfInputs( 1 );
29
30   this->m_DefaultParameters[ "FileName" ] =
31     TParameter( "string", "no_file_name" );
32 }
33
34 // -------------------------------------------------------------------------
35 cpPlugins::Plugins::ImageWriter::
36 ~ImageWriter( )
37 {
38 }
39
40 // -------------------------------------------------------------------------
41 std::string cpPlugins::Plugins::ImageWriter::
42 GetClassName( ) const
43 {
44   return( "cpPlugins::Plugins::ImageWriter" );
45 }
46
47 // -------------------------------------------------------------------------
48 std::string cpPlugins::Plugins::ImageWriter::
49 _GenerateData( )
50 {
51   itk::DataObject* dobj = this->_GetInput( 0 );
52
53   std::string ret = "itk::Image dimension not supported.";
54   cpPlugins_Plugins_ImageWriter_Dimension( ret, 1, dobj, _GenerateData0 );
55   else cpPlugins_Plugins_ImageWriter_Dimension( ret, 2, dobj, _GenerateData0 );
56   else cpPlugins_Plugins_ImageWriter_Dimension( ret, 3, dobj, _GenerateData0 );
57   else cpPlugins_Plugins_ImageWriter_Dimension( ret, 4, dobj, _GenerateData0 );
58
59   return( ret );
60 }
61
62 // -------------------------------------------------------------------------
63 template< unsigned int D >
64 std::string cpPlugins::Plugins::ImageWriter::
65 _GenerateData0( )
66 {
67   itk::ImageBase< D >* img =
68     dynamic_cast< itk::ImageBase< D >* >( this->_GetInput( 0 ) );
69
70   std::string ret = "itk::Image pixel type not supported";
71   cpPlugins_Plugins_ImageWriter_Pixel( ret, char, D, img, _GenerateData1 );
72   else cpPlugins_Plugins_ImageWriter_Pixel( ret, short, D, img, _GenerateData1 );
73   else cpPlugins_Plugins_ImageWriter_Pixel( ret, int, D, img, _GenerateData1 );
74   else cpPlugins_Plugins_ImageWriter_Pixel( ret, long, D, img, _GenerateData1 );
75   else cpPlugins_Plugins_ImageWriter_Pixel( ret, unsigned char, D, img, _GenerateData1 );
76   else cpPlugins_Plugins_ImageWriter_Pixel( ret, unsigned short, D, img, _GenerateData1 );
77   else cpPlugins_Plugins_ImageWriter_Pixel( ret, unsigned int, D, img, _GenerateData1 );
78   else cpPlugins_Plugins_ImageWriter_Pixel( ret, unsigned long, D, img, _GenerateData1 );
79   else cpPlugins_Plugins_ImageWriter_Pixel( ret, float, D, img, _GenerateData1 );
80   else cpPlugins_Plugins_ImageWriter_Pixel( ret, double, D, img, _GenerateData1 );
81   else cpPlugins_Plugins_ImageWriter_RGB( ret, char, D, img, _GenerateData1 );
82   else cpPlugins_Plugins_ImageWriter_RGB( ret, short, D, img, _GenerateData1 );
83   else cpPlugins_Plugins_ImageWriter_RGB( ret, int, D, img, _GenerateData1 );
84   else cpPlugins_Plugins_ImageWriter_RGB( ret, long, D, img, _GenerateData1 );
85   else cpPlugins_Plugins_ImageWriter_RGB( ret, unsigned char, D, img, _GenerateData1 );
86   else cpPlugins_Plugins_ImageWriter_RGB( ret, unsigned short, D, img, _GenerateData1 );
87   else cpPlugins_Plugins_ImageWriter_RGB( ret, unsigned int, D, img, _GenerateData1 );
88   else cpPlugins_Plugins_ImageWriter_RGB( ret, unsigned long, D, img, _GenerateData1 );
89   else cpPlugins_Plugins_ImageWriter_RGB( ret, float, D, img, _GenerateData1 );
90   else cpPlugins_Plugins_ImageWriter_RGB( ret, double, D, img, _GenerateData1 );
91
92   return( ret );
93 }
94
95 // -------------------------------------------------------------------------
96 template< class P, unsigned int D >
97 std::string cpPlugins::Plugins::ImageWriter::
98 _GenerateData1( )
99 {
100   typedef itk::Image< P, D > _TImage;
101   typedef itk::ImageFileWriter< _TImage > _TImageWriter;
102
103   TParameters::const_iterator fIt;
104
105   // Get image pixelType
106   fIt = this->m_Parameters.find( "FileName" );
107   if( fIt == this->m_Parameters.end( ) )
108     fIt = this->m_DefaultParameters.find( "FileName" );
109
110   _TImageWriter* writer =
111     dynamic_cast< _TImageWriter* >( this->m_Writer.GetPointer( ) );
112   if( writer == NULL )
113   {
114     this->m_Writer = _TImageWriter::New( );
115     writer = dynamic_cast< _TImageWriter* >( this->m_Writer.GetPointer( ) );
116
117   } // fi
118   writer->SetFileName( fIt->second.second );
119   writer->SetInput( dynamic_cast< _TImage* >( this->_GetInput( 0 ) ) );
120   try
121   {
122     writer->Update( );
123   }
124   catch( itk::ExceptionObject& err )
125   {
126     return( err.GetDescription( ) );
127
128   } // yrt
129   return( "" );
130 }
131
132 // eof - $RCSfile$