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 this->m_Parameters = this->m_DefaultParameters;
29 QStringList names = dialog.selectedFiles( );
30 QStringList::const_iterator qIt = names.begin( );
31 for( ; qIt != names.end( ); ++qIt )
32 this->m_Parameters.AddValueToStringList(
33 "FileNames", qIt->toStdString( )
35 this->m_Parameters.SetValueAsBool( "VectorType", false );
40 #endif // cpPlugins_Interface_QT4
45 // -------------------------------------------------------------------------
46 cpPlugins::IO::ImageReader::
50 this->SetNumberOfOutputs( 1 );
51 this->_MakeOutput< cpPlugins::Interface::Image >( 0 );
53 using namespace cpPlugins::Interface;
54 this->m_DefaultParameters.Configure( Parameters::StringList, "FileNames" );
55 this->m_DefaultParameters.Configure( Parameters::Bool, "VectorType" );
56 this->m_DefaultParameters.SetValueAsBool( "VectorType", false );
57 this->m_Parameters = this->m_DefaultParameters;
60 // -------------------------------------------------------------------------
61 cpPlugins::IO::ImageReader::
66 // -------------------------------------------------------------------------
67 std::string cpPlugins::IO::ImageReader::
72 this->m_Parameters.GetValueAsStringList( names, "FileNames" );
75 if( names.size( ) >= 1 )
77 // Guess image properties
78 itk::ImageIOBase::Pointer io =
79 itk::ImageIOFactory::CreateImageIO(
81 itk::ImageIOFactory::ReadMode
85 io->SetFileName( names[ 0 ] );
86 io->ReadImageInformation( );
87 if( names.size( ) >= 1 )
89 switch( io->GetNumberOfDimensions( ) )
91 case 2: r = this->_GD0< 2 >( io, names ); break;
92 case 3: r = this->_GD0< 3 >( io, names ); break;
93 case 4: r = this->_GD0< 4 >( io, names ); break;
95 r = "ImageReader: Image dimension not supported.";
102 r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\"";
105 r = "No image files given";
109 // -------------------------------------------------------------------------
110 template< unsigned int D >
111 std::string cpPlugins::IO::ImageReader::
112 _GD0( itk::ImageIOBase* io, const TStringList& names )
114 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
115 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
118 if( pt == itk::ImageIOBase::SCALAR )
122 case itk::ImageIOBase::UCHAR:
123 r = this->_GD1< unsigned char, D >( names );
125 case itk::ImageIOBase::CHAR:
126 r = this->_GD1< char, D >( names );
128 case itk::ImageIOBase::USHORT:
129 r = this->_GD1< unsigned short, D >( names );
131 case itk::ImageIOBase::SHORT:
132 r = this->_GD1< short, D >( names );
134 case itk::ImageIOBase::UINT:
135 r = this->_GD1< unsigned int, D >( names );
137 case itk::ImageIOBase::INT:
138 r = this->_GD1< int, D >( names );
140 case itk::ImageIOBase::ULONG:
141 r = this->_GD1< unsigned long, D >( names );
143 case itk::ImageIOBase::LONG:
144 r = this->_GD1< long, D >( names );
146 case itk::ImageIOBase::FLOAT:
147 r = this->_GD1< float, D >( names );
149 case itk::ImageIOBase::DOUBLE:
150 r = this->_GD1< double, D >( names );
153 r = "ImageReader: Scalar pixel type not supported.";
157 else if( pt == itk::ImageIOBase::RGB )
161 case itk::ImageIOBase::UCHAR:
162 r = this->_GD1< itk::RGBPixel< unsigned char >, D >( names );
164 case itk::ImageIOBase::CHAR:
165 r = this->_GD1< itk::RGBPixel< char >, D >( names );
167 case itk::ImageIOBase::USHORT:
168 r = this->_GD1< itk::RGBPixel< unsigned short >, D >( names );
170 case itk::ImageIOBase::SHORT:
171 r = this->_GD1< itk::RGBPixel< short >, D >( names );
173 case itk::ImageIOBase::UINT:
174 r = this->_GD1< itk::RGBPixel< unsigned int >, D >( names );
176 case itk::ImageIOBase::INT:
177 r = this->_GD1< itk::RGBPixel< int >, D >( names );
179 case itk::ImageIOBase::ULONG:
180 r = this->_GD1< itk::RGBPixel< unsigned long >, D >( names );
182 case itk::ImageIOBase::LONG:
183 r = this->_GD1< itk::RGBPixel< long >, D >( names );
185 case itk::ImageIOBase::FLOAT:
186 r = this->_GD1< itk::RGBPixel< float >, D >( names );
188 case itk::ImageIOBase::DOUBLE:
189 r = this->_GD1< itk::RGBPixel< double >, D >( names );
192 r = "ImageReader: RGB pixel type not supported.";
196 else if( pt == itk::ImageIOBase::RGBA )
200 case itk::ImageIOBase::UCHAR:
201 r = this->_GD1< itk::RGBAPixel< unsigned char >, D >( names );
203 case itk::ImageIOBase::CHAR:
204 r = this->_GD1< itk::RGBAPixel< char >, D >( names );
206 case itk::ImageIOBase::USHORT:
207 r = this->_GD1< itk::RGBAPixel< unsigned short >, D >( names );
209 case itk::ImageIOBase::SHORT:
210 r = this->_GD1< itk::RGBAPixel< short >, D >( names );
212 case itk::ImageIOBase::UINT:
213 r = this->_GD1< itk::RGBAPixel< unsigned int >, D >( names );
215 case itk::ImageIOBase::INT:
216 r = this->_GD1< itk::RGBAPixel< int >, D >( names );
218 case itk::ImageIOBase::ULONG:
219 r = this->_GD1< itk::RGBAPixel< unsigned long >, D >( names );
221 case itk::ImageIOBase::LONG:
222 r = this->_GD1< itk::RGBAPixel< long >, D >( names );
224 case itk::ImageIOBase::FLOAT:
225 r = this->_GD1< itk::RGBAPixel< float >, D >( names );
227 case itk::ImageIOBase::DOUBLE:
228 r = this->_GD1< itk::RGBAPixel< double >, D >( names );
231 r = "ImageReader: RGBA pixel type not supported.";
235 else if( pt == itk::ImageIOBase::VECTOR )
239 case itk::ImageIOBase::FLOAT:
240 r = this->_GD1< itk::Vector< float, D >, D >( names );
242 case itk::ImageIOBase::DOUBLE:
243 r = this->_GD1< itk::Vector< double, D >, D >( names );
246 r = "ImageReader: Vector type not supported.";
250 else if( pt == itk::ImageIOBase::POINT )
254 case itk::ImageIOBase::FLOAT:
255 r = this->_GD1< itk::Point< float, D >, D >( names );
257 case itk::ImageIOBase::DOUBLE:
258 r = this->_GD1< itk::Point< double, D >, D >( names );
261 r = "ImageReader: Point type not supported.";
265 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
269 case itk::ImageIOBase::FLOAT:
270 r = this->_GD1< itk::CovariantVector< float, D >, D >( names );
272 case itk::ImageIOBase::DOUBLE:
273 r = this->_GD1< itk::CovariantVector< double, D >, D >( names );
276 r = "ImageReader: CovariantVector type not supported.";
280 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
284 case itk::ImageIOBase::FLOAT:
286 this->_GD1< itk::SymmetricSecondRankTensor< float, D >, D >(
290 case itk::ImageIOBase::DOUBLE:
292 this->_GD1< itk::SymmetricSecondRankTensor< double, D >, D >(
297 r = "ImageReader: Vector type not supported.";
301 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
305 case itk::ImageIOBase::FLOAT:
306 r = this->_GD1< itk::DiffusionTensor3D< float >, D >( names );
308 case itk::ImageIOBase::DOUBLE:
309 r = this->_GD1< itk::DiffusionTensor3D< double >, D >( names );
312 r = "ImageReader: Diffusion tensor type not supported.";
316 else if( pt == itk::ImageIOBase::COMPLEX )
320 case itk::ImageIOBase::FLOAT:
321 r = this->_GD1< std::complex< float >, D >( names );
323 case itk::ImageIOBase::DOUBLE:
324 r = this->_GD1< std::complex< double >, D >( names );
327 r = "ImageReader: Complex type not supported.";
331 else if( pt == itk::ImageIOBase::OFFSET )
332 r = this->_GD1< itk::Offset< D >, D >( names );
334 r = "ImageReader: Image pixel type not yet supported.";
336 itk::ImageIOBase::FIXEDARRAY
337 itk::ImageIOBase::MATRIX
342 // -------------------------------------------------------------------------
343 template< class P, unsigned int D >
344 std::string cpPlugins::IO::ImageReader::
345 _GD1( const TStringList& names )
347 if( this->m_Parameters.GetValueAsBool( "VectorType" ) )
348 return( this->_RealGD< itk::VectorImage< P, D > >( names ) );
350 return( this->_RealGD< itk::Image< P, D > >( names ) );
353 // -------------------------------------------------------------------------
355 std::string cpPlugins::IO::ImageReader::
356 _RealGD( const TStringList& names )
358 cpPlugins::Interface::Image* out =
359 this->GetOutput< cpPlugins::Interface::Image >( 0 );
361 return( "ImageReader: No output object properly created." );
364 if( names.size( ) == 1 )
367 typedef itk::ImageFileReader< I > _SR;
368 _SR* reader = this->_CreateITK< _SR >( );
369 reader->SetFileName( names[ 0 ] );
373 out->SetITK< I >( reader->GetOutput( ) );
375 catch( itk::ExceptionObject& err )
377 r = "ImageReader: " + std::string( err.GetDescription( ) );
378 out->SetITK< I >( NULL );
382 else if( names.size( ) > 1 )
385 std::set< std::string > ordered_names;
386 for( unsigned int i = 0; i < names.size( ); ++i )
387 ordered_names.insert( names[ i ] );
389 typedef itk::ImageSeriesReader< I > _MR;
390 _MR* reader = this->_CreateITK< _MR >( );
391 std::set< std::string >::const_iterator fnIt = ordered_names.begin( );
392 for( ; fnIt != ordered_names.end( ); ++fnIt )
393 reader->AddFileName( *fnIt );
397 out->SetITK< I >( reader->GetOutput( ) );
399 catch( itk::ExceptionObject& err )
401 r = "ImageReader: " + std::string( err.GetDescription( ) );
402 out->SetITK< I >( NULL );
407 r = "ImageReader: No image files given";