1 #include "ImageReader.h"
2 #include <cpPlugins/Interface/Image.h>
4 #include <itkImageFileReader.h>
5 #include <itkImageSeriesReader.h>
7 // -------------------------------------------------------------------------
8 cpPlugins::IO::ImageReader::
12 this->_AddOutput< cpPlugins::Interface::Image >( "Output" );
14 this->m_Parameters->ConfigureAsOpenFileNameList( "FileNames" );
15 this->m_Parameters->ConfigureAsBool( "VectorType" );
16 this->m_Parameters->SetBool( "VectorType", false );
17 this->m_Parameters->SetAcceptedFileExtensions(
19 "Image files (*.bmp *.png *.jpg *.jpeg *.dcm *.mhd *.nhdr *.nrrd *.tiff)"
23 // -------------------------------------------------------------------------
24 cpPlugins::IO::ImageReader::
29 // -------------------------------------------------------------------------
30 std::string cpPlugins::IO::ImageReader::
34 TStringList names = this->m_Parameters->GetOpenFileNameList( "FileNames" );
37 if( names.size( ) >= 1 )
39 // Guess image properties
40 itk::ImageIOBase::Pointer io =
41 itk::ImageIOFactory::CreateImageIO(
43 itk::ImageIOFactory::ReadMode
47 io->SetFileName( names[ 0 ] );
48 io->ReadImageInformation( );
49 if( names.size( ) >= 1 )
51 switch( io->GetNumberOfDimensions( ) )
53 case 2: r = this->_GD0< 2 >( io, names ); break;
54 case 3: r = this->_GD0< 3 >( io, names ); break;
55 case 4: r = this->_GD0< 4 >( io, names ); break;
57 r = "ImageReader: Image dimension not supported.";
64 r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\"";
67 r = "ImageReader: No image files given";
71 // -------------------------------------------------------------------------
72 template< unsigned int D >
73 std::string cpPlugins::IO::ImageReader::
74 _GD0( itk::ImageIOBase* io, const TStringList& names )
76 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
77 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
80 if( pt == itk::ImageIOBase::SCALAR )
84 case itk::ImageIOBase::UCHAR:
85 r = this->_GD1< unsigned char, D >( names );
87 case itk::ImageIOBase::CHAR:
88 r = this->_GD1< char, D >( names );
90 case itk::ImageIOBase::USHORT:
91 r = this->_GD1< unsigned short, D >( names );
93 case itk::ImageIOBase::SHORT:
94 r = this->_GD1< short, D >( names );
96 case itk::ImageIOBase::UINT:
97 r = this->_GD1< unsigned int, D >( names );
99 case itk::ImageIOBase::INT:
100 r = this->_GD1< int, D >( names );
102 case itk::ImageIOBase::ULONG:
103 r = this->_GD1< unsigned long, D >( names );
105 case itk::ImageIOBase::LONG:
106 r = this->_GD1< long, D >( names );
108 case itk::ImageIOBase::FLOAT:
109 r = this->_GD1< float, D >( names );
111 case itk::ImageIOBase::DOUBLE:
112 r = this->_GD1< double, D >( names );
115 r = "ImageReader: Scalar pixel type not supported.";
119 else if( pt == itk::ImageIOBase::RGB )
123 case itk::ImageIOBase::UCHAR:
124 r = this->_GD1< itk::RGBPixel< unsigned char >, D >( names );
126 case itk::ImageIOBase::CHAR:
127 r = this->_GD1< itk::RGBPixel< char >, D >( names );
129 case itk::ImageIOBase::USHORT:
130 r = this->_GD1< itk::RGBPixel< unsigned short >, D >( names );
132 case itk::ImageIOBase::SHORT:
133 r = this->_GD1< itk::RGBPixel< short >, D >( names );
135 case itk::ImageIOBase::UINT:
136 r = this->_GD1< itk::RGBPixel< unsigned int >, D >( names );
138 case itk::ImageIOBase::INT:
139 r = this->_GD1< itk::RGBPixel< int >, D >( names );
141 case itk::ImageIOBase::ULONG:
142 r = this->_GD1< itk::RGBPixel< unsigned long >, D >( names );
144 case itk::ImageIOBase::LONG:
145 r = this->_GD1< itk::RGBPixel< long >, D >( names );
147 case itk::ImageIOBase::FLOAT:
148 r = this->_GD1< itk::RGBPixel< float >, D >( names );
150 case itk::ImageIOBase::DOUBLE:
151 r = this->_GD1< itk::RGBPixel< double >, D >( names );
154 r = "ImageReader: RGB pixel type not supported.";
158 else if( pt == itk::ImageIOBase::RGBA )
162 case itk::ImageIOBase::UCHAR:
163 r = this->_GD1< itk::RGBAPixel< unsigned char >, D >( names );
165 case itk::ImageIOBase::CHAR:
166 r = this->_GD1< itk::RGBAPixel< char >, D >( names );
168 case itk::ImageIOBase::USHORT:
169 r = this->_GD1< itk::RGBAPixel< unsigned short >, D >( names );
171 case itk::ImageIOBase::SHORT:
172 r = this->_GD1< itk::RGBAPixel< short >, D >( names );
174 case itk::ImageIOBase::UINT:
175 r = this->_GD1< itk::RGBAPixel< unsigned int >, D >( names );
177 case itk::ImageIOBase::INT:
178 r = this->_GD1< itk::RGBAPixel< int >, D >( names );
180 case itk::ImageIOBase::ULONG:
181 r = this->_GD1< itk::RGBAPixel< unsigned long >, D >( names );
183 case itk::ImageIOBase::LONG:
184 r = this->_GD1< itk::RGBAPixel< long >, D >( names );
186 case itk::ImageIOBase::FLOAT:
187 r = this->_GD1< itk::RGBAPixel< float >, D >( names );
189 case itk::ImageIOBase::DOUBLE:
190 r = this->_GD1< itk::RGBAPixel< double >, D >( names );
193 r = "ImageReader: RGBA pixel type not supported.";
197 else if( pt == itk::ImageIOBase::VECTOR )
201 case itk::ImageIOBase::FLOAT:
202 r = this->_GD1< itk::Vector< float, D >, D >( names );
204 case itk::ImageIOBase::DOUBLE:
205 r = this->_GD1< itk::Vector< double, D >, D >( names );
208 r = "ImageReader: Vector type not supported.";
212 else if( pt == itk::ImageIOBase::POINT )
216 case itk::ImageIOBase::FLOAT:
217 r = this->_GD1< itk::Point< float, D >, D >( names );
219 case itk::ImageIOBase::DOUBLE:
220 r = this->_GD1< itk::Point< double, D >, D >( names );
223 r = "ImageReader: Point type not supported.";
227 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
231 case itk::ImageIOBase::FLOAT:
232 r = this->_GD1< itk::CovariantVector< float, D >, D >( names );
234 case itk::ImageIOBase::DOUBLE:
235 r = this->_GD1< itk::CovariantVector< double, D >, D >( names );
238 r = "ImageReader: CovariantVector type not supported.";
242 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
246 case itk::ImageIOBase::FLOAT:
248 this->_GD1< itk::SymmetricSecondRankTensor< float, D >, D >(
252 case itk::ImageIOBase::DOUBLE:
254 this->_GD1< itk::SymmetricSecondRankTensor< double, D >, D >(
259 r = "ImageReader: Vector type not supported.";
263 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
267 case itk::ImageIOBase::FLOAT:
268 r = this->_GD1< itk::DiffusionTensor3D< float >, D >( names );
270 case itk::ImageIOBase::DOUBLE:
271 r = this->_GD1< itk::DiffusionTensor3D< double >, D >( names );
274 r = "ImageReader: Diffusion tensor type not supported.";
278 else if( pt == itk::ImageIOBase::COMPLEX )
282 case itk::ImageIOBase::FLOAT:
283 r = this->_GD1< std::complex< float >, D >( names );
285 case itk::ImageIOBase::DOUBLE:
286 r = this->_GD1< std::complex< double >, D >( names );
289 r = "ImageReader: Complex type not supported.";
293 else if( pt == itk::ImageIOBase::OFFSET )
294 r = this->_GD1< itk::Offset< D >, D >( names );
296 r = "ImageReader: Image pixel type not yet supported.";
298 itk::ImageIOBase::FIXEDARRAY
299 itk::ImageIOBase::MATRIX
304 // -------------------------------------------------------------------------
305 template< class P, unsigned int D >
306 std::string cpPlugins::IO::ImageReader::
307 _GD1( const TStringList& names )
309 if( this->m_Parameters->GetBool( "VectorType" ) )
310 return( this->_RealGD< itk::VectorImage< P, D > >( names ) );
312 return( this->_RealGD< itk::Image< P, D > >( names ) );
315 // -------------------------------------------------------------------------
317 std::string cpPlugins::IO::ImageReader::
318 _RealGD( const TStringList& names )
320 auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
322 return( "ImageReader: No output object properly created." );
325 if( names.size( ) == 1 )
328 typedef itk::ImageFileReader< I > _SR;
329 _SR* reader = this->_CreateITK< _SR >( );
330 reader->SetFileName( names[ 0 ] );
334 out->SetITK< I >( reader->GetOutput( ) );
335 out->SetName( names[ 0 ] );
337 catch( itk::ExceptionObject& err )
339 r = "ImageReader: " + std::string( err.GetDescription( ) );
340 out->SetITK< I >( NULL );
345 else if( names.size( ) > 1 )
348 typedef itk::ImageSeriesReader< I > _MR;
349 _MR* reader = this->_CreateITK< _MR >( );
350 for( unsigned int i = 0; i < names.size( ); ++i )
351 reader->AddFileName( names[ i ] );
355 out->SetITK< I >( reader->GetOutput( ) );
356 out->SetName( names[ 0 ] );
358 catch( itk::ExceptionObject& err )
360 r = "ImageReader: " + std::string( err.GetDescription( ) );
361 out->SetITK< I >( NULL );
367 r = "ImageReader: No image files given";