1 #include "ImageReader.h"
2 #include <cpPlugins/Interface/Image.h>
6 #include <itkImageFileReader.h>
7 #include <itkImageSeriesReader.h>
9 #ifdef cpPlugins_Interface_QT4
10 #include <QFileDialog>
11 #endif // cpPlugins_Interface_QT4
13 // -------------------------------------------------------------------------
14 bool cpPlugins::IO::ImageReader::
15 ExecConfigurationDialog( QWidget* parent )
19 #ifdef cpPlugins_Interface_QT4
21 // Show dialog and check if it was accepted
22 QFileDialog dialog( parent );
23 dialog.setFileMode( QFileDialog::ExistingFiles );
24 dialog.setDirectory( QFileDialog::tr( "." ) );
25 dialog.setNameFilter( QFileDialog::tr( "All files (*)" ) );
28 QStringList names = dialog.selectedFiles( );
29 QStringList::const_iterator qIt = names.begin( );
30 for( ; qIt != names.end( ); ++qIt )
31 this->m_Parameters->AddToStringList(
32 "FileNames", qIt->toStdString( )
34 this->m_Parameters->SetBool( "VectorType", false );
39 #endif // cpPlugins_Interface_QT4
44 // -------------------------------------------------------------------------
45 cpPlugins::IO::ImageReader::
49 this->SetNumberOfOutputs( 1 );
50 this->_MakeOutput< cpPlugins::Interface::Image >( 0 );
52 this->m_Parameters->ConfigureAsStringList( "FileNames" );
53 this->m_Parameters->ConfigureAsBool( "VectorType", false );
56 // -------------------------------------------------------------------------
57 cpPlugins::IO::ImageReader::
62 // -------------------------------------------------------------------------
63 std::string cpPlugins::IO::ImageReader::
68 this->m_Parameters->GetStringList( names, "FileNames" );
71 if( names.size( ) >= 1 )
73 // Guess image properties
74 itk::ImageIOBase::Pointer io =
75 itk::ImageIOFactory::CreateImageIO(
77 itk::ImageIOFactory::ReadMode
81 io->SetFileName( names[ 0 ] );
82 io->ReadImageInformation( );
83 if( names.size( ) >= 1 )
85 switch( io->GetNumberOfDimensions( ) )
87 case 2: r = this->_GD0< 2 >( io, names ); break;
88 case 3: r = this->_GD0< 3 >( io, names ); break;
89 case 4: r = this->_GD0< 4 >( io, names ); break;
91 r = "ImageReader: Image dimension not supported.";
98 r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\"";
101 r = "No image files given";
105 // -------------------------------------------------------------------------
106 template< unsigned int D >
107 std::string cpPlugins::IO::ImageReader::
108 _GD0( itk::ImageIOBase* io, const TStringList& names )
110 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
111 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
114 if( pt == itk::ImageIOBase::SCALAR )
118 case itk::ImageIOBase::UCHAR:
119 r = this->_GD1< unsigned char, D >( names );
121 case itk::ImageIOBase::CHAR:
122 r = this->_GD1< char, D >( names );
124 case itk::ImageIOBase::USHORT:
125 r = this->_GD1< unsigned short, D >( names );
127 case itk::ImageIOBase::SHORT:
128 r = this->_GD1< short, D >( names );
130 case itk::ImageIOBase::UINT:
131 r = this->_GD1< unsigned int, D >( names );
133 case itk::ImageIOBase::INT:
134 r = this->_GD1< int, D >( names );
136 case itk::ImageIOBase::ULONG:
137 r = this->_GD1< unsigned long, D >( names );
139 case itk::ImageIOBase::LONG:
140 r = this->_GD1< long, D >( names );
142 case itk::ImageIOBase::FLOAT:
143 r = this->_GD1< float, D >( names );
145 case itk::ImageIOBase::DOUBLE:
146 r = this->_GD1< double, D >( names );
149 r = "ImageReader: Scalar pixel type not supported.";
153 else if( pt == itk::ImageIOBase::RGB )
157 case itk::ImageIOBase::UCHAR:
158 r = this->_GD1< itk::RGBPixel< unsigned char >, D >( names );
160 case itk::ImageIOBase::CHAR:
161 r = this->_GD1< itk::RGBPixel< char >, D >( names );
163 case itk::ImageIOBase::USHORT:
164 r = this->_GD1< itk::RGBPixel< unsigned short >, D >( names );
166 case itk::ImageIOBase::SHORT:
167 r = this->_GD1< itk::RGBPixel< short >, D >( names );
169 case itk::ImageIOBase::UINT:
170 r = this->_GD1< itk::RGBPixel< unsigned int >, D >( names );
172 case itk::ImageIOBase::INT:
173 r = this->_GD1< itk::RGBPixel< int >, D >( names );
175 case itk::ImageIOBase::ULONG:
176 r = this->_GD1< itk::RGBPixel< unsigned long >, D >( names );
178 case itk::ImageIOBase::LONG:
179 r = this->_GD1< itk::RGBPixel< long >, D >( names );
181 case itk::ImageIOBase::FLOAT:
182 r = this->_GD1< itk::RGBPixel< float >, D >( names );
184 case itk::ImageIOBase::DOUBLE:
185 r = this->_GD1< itk::RGBPixel< double >, D >( names );
188 r = "ImageReader: RGB pixel type not supported.";
192 else if( pt == itk::ImageIOBase::RGBA )
196 case itk::ImageIOBase::UCHAR:
197 r = this->_GD1< itk::RGBAPixel< unsigned char >, D >( names );
199 case itk::ImageIOBase::CHAR:
200 r = this->_GD1< itk::RGBAPixel< char >, D >( names );
202 case itk::ImageIOBase::USHORT:
203 r = this->_GD1< itk::RGBAPixel< unsigned short >, D >( names );
205 case itk::ImageIOBase::SHORT:
206 r = this->_GD1< itk::RGBAPixel< short >, D >( names );
208 case itk::ImageIOBase::UINT:
209 r = this->_GD1< itk::RGBAPixel< unsigned int >, D >( names );
211 case itk::ImageIOBase::INT:
212 r = this->_GD1< itk::RGBAPixel< int >, D >( names );
214 case itk::ImageIOBase::ULONG:
215 r = this->_GD1< itk::RGBAPixel< unsigned long >, D >( names );
217 case itk::ImageIOBase::LONG:
218 r = this->_GD1< itk::RGBAPixel< long >, D >( names );
220 case itk::ImageIOBase::FLOAT:
221 r = this->_GD1< itk::RGBAPixel< float >, D >( names );
223 case itk::ImageIOBase::DOUBLE:
224 r = this->_GD1< itk::RGBAPixel< double >, D >( names );
227 r = "ImageReader: RGBA pixel type not supported.";
231 else if( pt == itk::ImageIOBase::VECTOR )
235 case itk::ImageIOBase::FLOAT:
236 r = this->_GD1< itk::Vector< float, D >, D >( names );
238 case itk::ImageIOBase::DOUBLE:
239 r = this->_GD1< itk::Vector< double, D >, D >( names );
242 r = "ImageReader: Vector type not supported.";
246 else if( pt == itk::ImageIOBase::POINT )
250 case itk::ImageIOBase::FLOAT:
251 r = this->_GD1< itk::Point< float, D >, D >( names );
253 case itk::ImageIOBase::DOUBLE:
254 r = this->_GD1< itk::Point< double, D >, D >( names );
257 r = "ImageReader: Point type not supported.";
261 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
265 case itk::ImageIOBase::FLOAT:
266 r = this->_GD1< itk::CovariantVector< float, D >, D >( names );
268 case itk::ImageIOBase::DOUBLE:
269 r = this->_GD1< itk::CovariantVector< double, D >, D >( names );
272 r = "ImageReader: CovariantVector type not supported.";
276 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
280 case itk::ImageIOBase::FLOAT:
282 this->_GD1< itk::SymmetricSecondRankTensor< float, D >, D >(
286 case itk::ImageIOBase::DOUBLE:
288 this->_GD1< itk::SymmetricSecondRankTensor< double, D >, D >(
293 r = "ImageReader: Vector type not supported.";
297 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
301 case itk::ImageIOBase::FLOAT:
302 r = this->_GD1< itk::DiffusionTensor3D< float >, D >( names );
304 case itk::ImageIOBase::DOUBLE:
305 r = this->_GD1< itk::DiffusionTensor3D< double >, D >( names );
308 r = "ImageReader: Diffusion tensor type not supported.";
312 else if( pt == itk::ImageIOBase::COMPLEX )
316 case itk::ImageIOBase::FLOAT:
317 r = this->_GD1< std::complex< float >, D >( names );
319 case itk::ImageIOBase::DOUBLE:
320 r = this->_GD1< std::complex< double >, D >( names );
323 r = "ImageReader: Complex type not supported.";
327 else if( pt == itk::ImageIOBase::OFFSET )
328 r = this->_GD1< itk::Offset< D >, D >( names );
330 r = "ImageReader: Image pixel type not yet supported.";
332 itk::ImageIOBase::FIXEDARRAY
333 itk::ImageIOBase::MATRIX
338 // -------------------------------------------------------------------------
339 template< class P, unsigned int D >
340 std::string cpPlugins::IO::ImageReader::
341 _GD1( const TStringList& names )
343 if( this->m_Parameters->GetBool( "VectorType" ) )
344 return( this->_RealGD< itk::VectorImage< P, D > >( names ) );
346 return( this->_RealGD< itk::Image< P, D > >( names ) );
349 // -------------------------------------------------------------------------
351 std::string cpPlugins::IO::ImageReader::
352 _RealGD( const TStringList& names )
354 cpPlugins::Interface::Image* out =
355 this->GetOutput< cpPlugins::Interface::Image >( 0 );
357 return( "ImageReader: No output object properly created." );
360 if( names.size( ) == 1 )
363 typedef itk::ImageFileReader< I > _SR;
364 _SR* reader = this->_CreateITK< _SR >( );
365 reader->SetFileName( names[ 0 ] );
369 out->SetITK< I >( reader->GetOutput( ) );
371 catch( itk::ExceptionObject& err )
373 r = "ImageReader: " + std::string( err.GetDescription( ) );
374 out->SetITK< I >( NULL );
378 else if( names.size( ) > 1 )
381 std::set< std::string > ordered_names;
382 for( unsigned int i = 0; i < names.size( ); ++i )
383 ordered_names.insert( names[ i ] );
385 typedef itk::ImageSeriesReader< I > _MR;
386 _MR* reader = this->_CreateITK< _MR >( );
387 std::set< std::string >::const_iterator fnIt = ordered_names.begin( );
388 for( ; fnIt != ordered_names.end( ); ++fnIt )
389 reader->AddFileName( *fnIt );
393 out->SetITK< I >( reader->GetOutput( ) );
395 catch( itk::ExceptionObject& err )
397 r = "ImageReader: " + std::string( err.GetDescription( ) );
398 out->SetITK< I >( NULL );
403 r = "ImageReader: No image files given";