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->_MakeOutput< cpPlugins::Interface::Image >( "Output" );
51 this->m_Parameters->ConfigureAsStringList( "FileNames" );
52 this->m_Parameters->ConfigureAsBool( "VectorType", false );
55 // -------------------------------------------------------------------------
56 cpPlugins::IO::ImageReader::
61 // -------------------------------------------------------------------------
62 std::string cpPlugins::IO::ImageReader::
67 this->m_Parameters->GetStringList( names, "FileNames" );
70 if( names.size( ) >= 1 )
72 // Guess image properties
73 itk::ImageIOBase::Pointer io =
74 itk::ImageIOFactory::CreateImageIO(
76 itk::ImageIOFactory::ReadMode
80 io->SetFileName( names[ 0 ] );
81 io->ReadImageInformation( );
82 if( names.size( ) >= 1 )
84 switch( io->GetNumberOfDimensions( ) )
86 case 2: r = this->_GD0< 2 >( io, names ); break;
87 case 3: r = this->_GD0< 3 >( io, names ); break;
88 case 4: r = this->_GD0< 4 >( io, names ); break;
90 r = "ImageReader: Image dimension not supported.";
97 r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\"";
100 r = "No image files given";
104 // -------------------------------------------------------------------------
105 template< unsigned int D >
106 std::string cpPlugins::IO::ImageReader::
107 _GD0( itk::ImageIOBase* io, const TStringList& names )
109 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
110 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
113 if( pt == itk::ImageIOBase::SCALAR )
117 case itk::ImageIOBase::UCHAR:
118 r = this->_GD1< unsigned char, D >( names );
120 case itk::ImageIOBase::CHAR:
121 r = this->_GD1< char, D >( names );
123 case itk::ImageIOBase::USHORT:
124 r = this->_GD1< unsigned short, D >( names );
126 case itk::ImageIOBase::SHORT:
127 r = this->_GD1< short, D >( names );
129 case itk::ImageIOBase::UINT:
130 r = this->_GD1< unsigned int, D >( names );
132 case itk::ImageIOBase::INT:
133 r = this->_GD1< int, D >( names );
135 case itk::ImageIOBase::ULONG:
136 r = this->_GD1< unsigned long, D >( names );
138 case itk::ImageIOBase::LONG:
139 r = this->_GD1< long, D >( names );
141 case itk::ImageIOBase::FLOAT:
142 r = this->_GD1< float, D >( names );
144 case itk::ImageIOBase::DOUBLE:
145 r = this->_GD1< double, D >( names );
148 r = "ImageReader: Scalar pixel type not supported.";
152 else if( pt == itk::ImageIOBase::RGB )
156 case itk::ImageIOBase::UCHAR:
157 r = this->_GD1< itk::RGBPixel< unsigned char >, D >( names );
159 case itk::ImageIOBase::CHAR:
160 r = this->_GD1< itk::RGBPixel< char >, D >( names );
162 case itk::ImageIOBase::USHORT:
163 r = this->_GD1< itk::RGBPixel< unsigned short >, D >( names );
165 case itk::ImageIOBase::SHORT:
166 r = this->_GD1< itk::RGBPixel< short >, D >( names );
168 case itk::ImageIOBase::UINT:
169 r = this->_GD1< itk::RGBPixel< unsigned int >, D >( names );
171 case itk::ImageIOBase::INT:
172 r = this->_GD1< itk::RGBPixel< int >, D >( names );
174 case itk::ImageIOBase::ULONG:
175 r = this->_GD1< itk::RGBPixel< unsigned long >, D >( names );
177 case itk::ImageIOBase::LONG:
178 r = this->_GD1< itk::RGBPixel< long >, D >( names );
180 case itk::ImageIOBase::FLOAT:
181 r = this->_GD1< itk::RGBPixel< float >, D >( names );
183 case itk::ImageIOBase::DOUBLE:
184 r = this->_GD1< itk::RGBPixel< double >, D >( names );
187 r = "ImageReader: RGB pixel type not supported.";
191 else if( pt == itk::ImageIOBase::RGBA )
195 case itk::ImageIOBase::UCHAR:
196 r = this->_GD1< itk::RGBAPixel< unsigned char >, D >( names );
198 case itk::ImageIOBase::CHAR:
199 r = this->_GD1< itk::RGBAPixel< char >, D >( names );
201 case itk::ImageIOBase::USHORT:
202 r = this->_GD1< itk::RGBAPixel< unsigned short >, D >( names );
204 case itk::ImageIOBase::SHORT:
205 r = this->_GD1< itk::RGBAPixel< short >, D >( names );
207 case itk::ImageIOBase::UINT:
208 r = this->_GD1< itk::RGBAPixel< unsigned int >, D >( names );
210 case itk::ImageIOBase::INT:
211 r = this->_GD1< itk::RGBAPixel< int >, D >( names );
213 case itk::ImageIOBase::ULONG:
214 r = this->_GD1< itk::RGBAPixel< unsigned long >, D >( names );
216 case itk::ImageIOBase::LONG:
217 r = this->_GD1< itk::RGBAPixel< long >, D >( names );
219 case itk::ImageIOBase::FLOAT:
220 r = this->_GD1< itk::RGBAPixel< float >, D >( names );
222 case itk::ImageIOBase::DOUBLE:
223 r = this->_GD1< itk::RGBAPixel< double >, D >( names );
226 r = "ImageReader: RGBA pixel type not supported.";
230 else if( pt == itk::ImageIOBase::VECTOR )
234 case itk::ImageIOBase::FLOAT:
235 r = this->_GD1< itk::Vector< float, D >, D >( names );
237 case itk::ImageIOBase::DOUBLE:
238 r = this->_GD1< itk::Vector< double, D >, D >( names );
241 r = "ImageReader: Vector type not supported.";
245 else if( pt == itk::ImageIOBase::POINT )
249 case itk::ImageIOBase::FLOAT:
250 r = this->_GD1< itk::Point< float, D >, D >( names );
252 case itk::ImageIOBase::DOUBLE:
253 r = this->_GD1< itk::Point< double, D >, D >( names );
256 r = "ImageReader: Point type not supported.";
260 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
264 case itk::ImageIOBase::FLOAT:
265 r = this->_GD1< itk::CovariantVector< float, D >, D >( names );
267 case itk::ImageIOBase::DOUBLE:
268 r = this->_GD1< itk::CovariantVector< double, D >, D >( names );
271 r = "ImageReader: CovariantVector type not supported.";
275 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
279 case itk::ImageIOBase::FLOAT:
281 this->_GD1< itk::SymmetricSecondRankTensor< float, D >, D >(
285 case itk::ImageIOBase::DOUBLE:
287 this->_GD1< itk::SymmetricSecondRankTensor< double, D >, D >(
292 r = "ImageReader: Vector type not supported.";
296 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
300 case itk::ImageIOBase::FLOAT:
301 r = this->_GD1< itk::DiffusionTensor3D< float >, D >( names );
303 case itk::ImageIOBase::DOUBLE:
304 r = this->_GD1< itk::DiffusionTensor3D< double >, D >( names );
307 r = "ImageReader: Diffusion tensor type not supported.";
311 else if( pt == itk::ImageIOBase::COMPLEX )
315 case itk::ImageIOBase::FLOAT:
316 r = this->_GD1< std::complex< float >, D >( names );
318 case itk::ImageIOBase::DOUBLE:
319 r = this->_GD1< std::complex< double >, D >( names );
322 r = "ImageReader: Complex type not supported.";
326 else if( pt == itk::ImageIOBase::OFFSET )
327 r = this->_GD1< itk::Offset< D >, D >( names );
329 r = "ImageReader: Image pixel type not yet supported.";
331 itk::ImageIOBase::FIXEDARRAY
332 itk::ImageIOBase::MATRIX
337 // -------------------------------------------------------------------------
338 template< class P, unsigned int D >
339 std::string cpPlugins::IO::ImageReader::
340 _GD1( const TStringList& names )
342 if( this->m_Parameters->GetBool( "VectorType" ) )
343 return( this->_RealGD< itk::VectorImage< P, D > >( names ) );
345 return( this->_RealGD< itk::Image< P, D > >( names ) );
348 // -------------------------------------------------------------------------
350 std::string cpPlugins::IO::ImageReader::
351 _RealGD( const TStringList& names )
353 cpPlugins::Interface::Image* out =
354 this->GetOutput< cpPlugins::Interface::Image >( "Output" );
356 return( "ImageReader: No output object properly created." );
359 if( names.size( ) == 1 )
362 typedef itk::ImageFileReader< I > _SR;
363 _SR* reader = this->_CreateITK< _SR >( );
364 reader->SetFileName( names[ 0 ] );
368 out->SetITK< I >( reader->GetOutput( ) );
369 out->SetName( names[ 0 ] );
371 catch( itk::ExceptionObject& err )
373 r = "ImageReader: " + std::string( err.GetDescription( ) );
374 out->SetITK< I >( NULL );
379 else if( names.size( ) > 1 )
382 std::set< std::string > ordered_names;
383 for( unsigned int i = 0; i < names.size( ); ++i )
384 ordered_names.insert( names[ i ] );
386 typedef itk::ImageSeriesReader< I > _MR;
387 _MR* reader = this->_CreateITK< _MR >( );
388 std::set< std::string >::const_iterator fnIt = ordered_names.begin( );
389 for( ; fnIt != ordered_names.end( ); ++fnIt )
390 reader->AddFileName( *fnIt );
394 out->SetITK< I >( reader->GetOutput( ) );
395 out->SetName( *( ordered_names.begin( ) ) );
397 catch( itk::ExceptionObject& err )
399 r = "ImageReader: " + std::string( err.GetDescription( ) );
400 out->SetITK< I >( NULL );
406 r = "ImageReader: No image files given";