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->m_ClassName = "cpPlugins::IO::ImageReader";
51 this->m_ClassCategory = "ImageReader";
53 this->SetNumberOfOutputs( 1 );
54 this->_MakeOutput< cpPlugins::Interface::Image >( 0 );
56 using namespace cpPlugins::Interface;
57 this->m_DefaultParameters.Configure( Parameters::StringList, "FileNames" );
58 this->m_DefaultParameters.Configure( Parameters::Bool, "VectorType" );
59 this->m_DefaultParameters.SetValueAsBool( "VectorType", false );
60 this->m_Parameters = this->m_DefaultParameters;
63 // -------------------------------------------------------------------------
64 cpPlugins::IO::ImageReader::
69 // -------------------------------------------------------------------------
70 std::string cpPlugins::IO::ImageReader::
75 this->m_Parameters.GetValueAsStringList( names, "FileNames" );
78 if( names.size( ) >= 1 )
80 // Guess image properties
81 itk::ImageIOBase::Pointer io =
82 itk::ImageIOFactory::CreateImageIO(
84 itk::ImageIOFactory::ReadMode
88 io->SetFileName( names[ 0 ] );
89 io->ReadImageInformation( );
90 if( names.size( ) >= 1 )
92 switch( io->GetNumberOfDimensions( ) )
94 case 2: r = this->_GD0< 2 >( io, names ); break;
95 case 3: r = this->_GD0< 3 >( io, names ); break;
96 case 4: r = this->_GD0< 4 >( io, names ); break;
98 r = "ImageReader: Image dimension not supported.";
105 r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\"";
108 r = "No image files given";
112 // -------------------------------------------------------------------------
113 template< unsigned int D >
114 std::string cpPlugins::IO::ImageReader::
115 _GD0( itk::ImageIOBase* io, const TStringList& names )
117 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
118 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
121 if( pt == itk::ImageIOBase::SCALAR )
125 case itk::ImageIOBase::UCHAR:
126 r = this->_GD1< unsigned char, D >( names );
128 case itk::ImageIOBase::CHAR:
129 r = this->_GD1< char, D >( names );
131 case itk::ImageIOBase::USHORT:
132 r = this->_GD1< unsigned short, D >( names );
134 case itk::ImageIOBase::SHORT:
135 r = this->_GD1< short, D >( names );
137 case itk::ImageIOBase::UINT:
138 r = this->_GD1< unsigned int, D >( names );
140 case itk::ImageIOBase::INT:
141 r = this->_GD1< int, D >( names );
143 case itk::ImageIOBase::ULONG:
144 r = this->_GD1< unsigned long, D >( names );
146 case itk::ImageIOBase::LONG:
147 r = this->_GD1< long, D >( names );
149 case itk::ImageIOBase::FLOAT:
150 r = this->_GD1< float, D >( names );
152 case itk::ImageIOBase::DOUBLE:
153 r = this->_GD1< double, D >( names );
156 r = "ImageReader: Scalar pixel type not supported.";
160 else if( pt == itk::ImageIOBase::RGB )
164 case itk::ImageIOBase::UCHAR:
165 r = this->_GD1< itk::RGBPixel< unsigned char >, D >( names );
167 case itk::ImageIOBase::CHAR:
168 r = this->_GD1< itk::RGBPixel< char >, D >( names );
170 case itk::ImageIOBase::USHORT:
171 r = this->_GD1< itk::RGBPixel< unsigned short >, D >( names );
173 case itk::ImageIOBase::SHORT:
174 r = this->_GD1< itk::RGBPixel< short >, D >( names );
176 case itk::ImageIOBase::UINT:
177 r = this->_GD1< itk::RGBPixel< unsigned int >, D >( names );
179 case itk::ImageIOBase::INT:
180 r = this->_GD1< itk::RGBPixel< int >, D >( names );
182 case itk::ImageIOBase::ULONG:
183 r = this->_GD1< itk::RGBPixel< unsigned long >, D >( names );
185 case itk::ImageIOBase::LONG:
186 r = this->_GD1< itk::RGBPixel< long >, D >( names );
188 case itk::ImageIOBase::FLOAT:
189 r = this->_GD1< itk::RGBPixel< float >, D >( names );
191 case itk::ImageIOBase::DOUBLE:
192 r = this->_GD1< itk::RGBPixel< double >, D >( names );
195 r = "ImageReader: RGB pixel type not supported.";
199 else if( pt == itk::ImageIOBase::RGBA )
203 case itk::ImageIOBase::UCHAR:
204 r = this->_GD1< itk::RGBAPixel< unsigned char >, D >( names );
206 case itk::ImageIOBase::CHAR:
207 r = this->_GD1< itk::RGBAPixel< char >, D >( names );
209 case itk::ImageIOBase::USHORT:
210 r = this->_GD1< itk::RGBAPixel< unsigned short >, D >( names );
212 case itk::ImageIOBase::SHORT:
213 r = this->_GD1< itk::RGBAPixel< short >, D >( names );
215 case itk::ImageIOBase::UINT:
216 r = this->_GD1< itk::RGBAPixel< unsigned int >, D >( names );
218 case itk::ImageIOBase::INT:
219 r = this->_GD1< itk::RGBAPixel< int >, D >( names );
221 case itk::ImageIOBase::ULONG:
222 r = this->_GD1< itk::RGBAPixel< unsigned long >, D >( names );
224 case itk::ImageIOBase::LONG:
225 r = this->_GD1< itk::RGBAPixel< long >, D >( names );
227 case itk::ImageIOBase::FLOAT:
228 r = this->_GD1< itk::RGBAPixel< float >, D >( names );
230 case itk::ImageIOBase::DOUBLE:
231 r = this->_GD1< itk::RGBAPixel< double >, D >( names );
234 r = "ImageReader: RGBA pixel type not supported.";
238 else if( pt == itk::ImageIOBase::VECTOR )
242 case itk::ImageIOBase::FLOAT:
243 r = this->_GD1< itk::Vector< float, D >, D >( names );
245 case itk::ImageIOBase::DOUBLE:
246 r = this->_GD1< itk::Vector< double, D >, D >( names );
249 r = "ImageReader: Vector type not supported.";
253 else if( pt == itk::ImageIOBase::POINT )
257 case itk::ImageIOBase::FLOAT:
258 r = this->_GD1< itk::Point< float, D >, D >( names );
260 case itk::ImageIOBase::DOUBLE:
261 r = this->_GD1< itk::Point< double, D >, D >( names );
264 r = "ImageReader: Point type not supported.";
268 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
272 case itk::ImageIOBase::FLOAT:
273 r = this->_GD1< itk::CovariantVector< float, D >, D >( names );
275 case itk::ImageIOBase::DOUBLE:
276 r = this->_GD1< itk::CovariantVector< double, D >, D >( names );
279 r = "ImageReader: CovariantVector type not supported.";
283 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
287 case itk::ImageIOBase::FLOAT:
289 this->_GD1< itk::SymmetricSecondRankTensor< float, D >, D >(
293 case itk::ImageIOBase::DOUBLE:
295 this->_GD1< itk::SymmetricSecondRankTensor< double, D >, D >(
300 r = "ImageReader: Vector type not supported.";
304 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
308 case itk::ImageIOBase::FLOAT:
309 r = this->_GD1< itk::DiffusionTensor3D< float >, D >( names );
311 case itk::ImageIOBase::DOUBLE:
312 r = this->_GD1< itk::DiffusionTensor3D< double >, D >( names );
315 r = "ImageReader: Diffusion tensor type not supported.";
319 else if( pt == itk::ImageIOBase::COMPLEX )
323 case itk::ImageIOBase::FLOAT:
324 r = this->_GD1< std::complex< float >, D >( names );
326 case itk::ImageIOBase::DOUBLE:
327 r = this->_GD1< std::complex< double >, D >( names );
330 r = "ImageReader: Complex type not supported.";
334 else if( pt == itk::ImageIOBase::OFFSET )
335 r = this->_GD1< itk::Offset< D >, D >( names );
337 r = "ImageReader: Image pixel type not yet supported.";
339 itk::ImageIOBase::FIXEDARRAY
340 itk::ImageIOBase::MATRIX
345 // -------------------------------------------------------------------------
346 template< class P, unsigned int D >
347 std::string cpPlugins::IO::ImageReader::
348 _GD1( const TStringList& names )
350 if( this->m_Parameters.GetValueAsBool( "VectorType" ) )
351 return( this->_RealGD< itk::VectorImage< P, D > >( names ) );
353 return( this->_RealGD< itk::Image< P, D > >( names ) );
356 // -------------------------------------------------------------------------
358 std::string cpPlugins::IO::ImageReader::
359 _RealGD( const TStringList& names )
361 cpPlugins::Interface::Image* out =
362 this->GetOutput< cpPlugins::Interface::Image >( 0 );
364 return( "ImageReader: No output object properly created." );
367 if( names.size( ) == 1 )
370 typedef itk::ImageFileReader< I > _SR;
371 _SR* reader = this->_CreateITK< _SR >( );
372 reader->SetFileName( names[ 0 ] );
376 out->SetITK< I >( reader->GetOutput( ) );
378 catch( itk::ExceptionObject& err )
380 r = "ImageReader: " + std::string( err.GetDescription( ) );
381 out->SetITK< I >( NULL );
385 else if( names.size( ) > 1 )
388 std::set< std::string > ordered_names;
389 for( unsigned int i = 0; i < names.size( ); ++i )
390 ordered_names.insert( names[ i ] );
392 typedef itk::ImageSeriesReader< I > _MR;
393 _MR* reader = this->_CreateITK< _MR >( );
394 std::set< std::string >::const_iterator fnIt = ordered_names.begin( );
395 for( ; fnIt != ordered_names.end( ); ++fnIt )
396 reader->AddFileName( *fnIt );
400 out->SetITK< I >( reader->GetOutput( ) );
402 catch( itk::ExceptionObject& err )
404 r = "ImageReader: " + std::string( err.GetDescription( ) );
405 out->SetITK< I >( NULL );
410 r = "ImageReader: No image files given";