1 #include "ImageReader.h"
2 #include <cpPlugins/Interface/Image.h>
4 #include <itkImageFileReader.h>
5 #include <itkImageSeriesReader.h>
8 #ifdef cpPlugins_Interface_QT4
10 #endif // cpPlugins_Interface_QT4
12 // -------------------------------------------------------------------------
13 cpPlugins::IO::ImageReader::
14 DialogResult cpPlugins::IO::ImageReader::
15 ExecConfigurationDialog( QWidget* parent )
17 DialogResult r = Self::DialogResult_Cancel;
19 #ifdef cpPlugins_Interface_QT4
23 << "Image files (*.bmp *.png *.jpg *.jpeg *.dcm *.mhd *.nhdr *.nrrd *.tiff)"
26 TStringList names = this->m_Parameters->GetFileNameList( "FileNames" );
27 std::string name = ( names.size( ) > 0 )? names[ 0 ]: ".";
29 // Show dialog and check if it was accepted
30 QFileDialog dialog( parent );
31 dialog.setFileMode( QFileDialog::ExistingFiles );
32 dialog.setDirectory( QFileDialog::tr( name.c_str( ) ) );
33 dialog.setNameFilters( filters );
34 dialog.setAcceptMode( QFileDialog::AcceptOpen );
37 QStringList names = dialog.selectedFiles( );
38 QStringList::const_iterator qIt = names.begin( );
39 for( ; qIt != names.end( ); ++qIt )
40 this->m_Parameters->AddToStringList(
41 "FileNames", qIt->toStdString( )
43 this->m_Parameters->SetBool( "VectorType", false );
44 r = Self::DialogResult_NoModal;
48 #endif // cpPlugins_Interface_QT4
54 // -------------------------------------------------------------------------
55 cpPlugins::IO::ImageReader::
59 this->_AddOutput< cpPlugins::Interface::Image >( "Output" );
61 this->m_Parameters->ConfigureAsOpenFileNameList( "FileNames" );
62 this->m_Parameters->ConfigureAsBool( "VectorType" );
63 this->m_Parameters->SetBool( "VectorType", false );
66 // -------------------------------------------------------------------------
67 cpPlugins::IO::ImageReader::
72 // -------------------------------------------------------------------------
73 std::string cpPlugins::IO::ImageReader::
77 TStringList names = this->m_Parameters->GetOpenFileNameList( "FileNames" );
80 if( names.size( ) >= 1 )
82 // Guess image properties
83 itk::ImageIOBase::Pointer io =
84 itk::ImageIOFactory::CreateImageIO(
86 itk::ImageIOFactory::ReadMode
90 io->SetFileName( names[ 0 ] );
91 io->ReadImageInformation( );
92 if( names.size( ) >= 1 )
94 switch( io->GetNumberOfDimensions( ) )
96 case 2: r = this->_GD0< 2 >( io, names ); break;
97 case 3: r = this->_GD0< 3 >( io, names ); break;
98 case 4: r = this->_GD0< 4 >( io, names ); break;
100 r = "ImageReader: Image dimension not supported.";
107 r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\"";
110 r = "ImageReader: No image files given";
114 // -------------------------------------------------------------------------
115 template< unsigned int D >
116 std::string cpPlugins::IO::ImageReader::
117 _GD0( itk::ImageIOBase* io, const TStringList& names )
119 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
120 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
123 if( pt == itk::ImageIOBase::SCALAR )
127 case itk::ImageIOBase::UCHAR:
128 r = this->_GD1< unsigned char, D >( names );
130 case itk::ImageIOBase::CHAR:
131 r = this->_GD1< char, D >( names );
133 case itk::ImageIOBase::USHORT:
134 r = this->_GD1< unsigned short, D >( names );
136 case itk::ImageIOBase::SHORT:
137 r = this->_GD1< short, D >( names );
139 case itk::ImageIOBase::UINT:
140 r = this->_GD1< unsigned int, D >( names );
142 case itk::ImageIOBase::INT:
143 r = this->_GD1< int, D >( names );
145 case itk::ImageIOBase::ULONG:
146 r = this->_GD1< unsigned long, D >( names );
148 case itk::ImageIOBase::LONG:
149 r = this->_GD1< long, D >( names );
151 case itk::ImageIOBase::FLOAT:
152 r = this->_GD1< float, D >( names );
154 case itk::ImageIOBase::DOUBLE:
155 r = this->_GD1< double, D >( names );
158 r = "ImageReader: Scalar pixel type not supported.";
162 else if( pt == itk::ImageIOBase::RGB )
166 case itk::ImageIOBase::UCHAR:
167 r = this->_GD1< itk::RGBPixel< unsigned char >, D >( names );
169 case itk::ImageIOBase::CHAR:
170 r = this->_GD1< itk::RGBPixel< char >, D >( names );
172 case itk::ImageIOBase::USHORT:
173 r = this->_GD1< itk::RGBPixel< unsigned short >, D >( names );
175 case itk::ImageIOBase::SHORT:
176 r = this->_GD1< itk::RGBPixel< short >, D >( names );
178 case itk::ImageIOBase::UINT:
179 r = this->_GD1< itk::RGBPixel< unsigned int >, D >( names );
181 case itk::ImageIOBase::INT:
182 r = this->_GD1< itk::RGBPixel< int >, D >( names );
184 case itk::ImageIOBase::ULONG:
185 r = this->_GD1< itk::RGBPixel< unsigned long >, D >( names );
187 case itk::ImageIOBase::LONG:
188 r = this->_GD1< itk::RGBPixel< long >, D >( names );
190 case itk::ImageIOBase::FLOAT:
191 r = this->_GD1< itk::RGBPixel< float >, D >( names );
193 case itk::ImageIOBase::DOUBLE:
194 r = this->_GD1< itk::RGBPixel< double >, D >( names );
197 r = "ImageReader: RGB pixel type not supported.";
201 else if( pt == itk::ImageIOBase::RGBA )
205 case itk::ImageIOBase::UCHAR:
206 r = this->_GD1< itk::RGBAPixel< unsigned char >, D >( names );
208 case itk::ImageIOBase::CHAR:
209 r = this->_GD1< itk::RGBAPixel< char >, D >( names );
211 case itk::ImageIOBase::USHORT:
212 r = this->_GD1< itk::RGBAPixel< unsigned short >, D >( names );
214 case itk::ImageIOBase::SHORT:
215 r = this->_GD1< itk::RGBAPixel< short >, D >( names );
217 case itk::ImageIOBase::UINT:
218 r = this->_GD1< itk::RGBAPixel< unsigned int >, D >( names );
220 case itk::ImageIOBase::INT:
221 r = this->_GD1< itk::RGBAPixel< int >, D >( names );
223 case itk::ImageIOBase::ULONG:
224 r = this->_GD1< itk::RGBAPixel< unsigned long >, D >( names );
226 case itk::ImageIOBase::LONG:
227 r = this->_GD1< itk::RGBAPixel< long >, D >( names );
229 case itk::ImageIOBase::FLOAT:
230 r = this->_GD1< itk::RGBAPixel< float >, D >( names );
232 case itk::ImageIOBase::DOUBLE:
233 r = this->_GD1< itk::RGBAPixel< double >, D >( names );
236 r = "ImageReader: RGBA pixel type not supported.";
240 else if( pt == itk::ImageIOBase::VECTOR )
244 case itk::ImageIOBase::FLOAT:
245 r = this->_GD1< itk::Vector< float, D >, D >( names );
247 case itk::ImageIOBase::DOUBLE:
248 r = this->_GD1< itk::Vector< double, D >, D >( names );
251 r = "ImageReader: Vector type not supported.";
255 else if( pt == itk::ImageIOBase::POINT )
259 case itk::ImageIOBase::FLOAT:
260 r = this->_GD1< itk::Point< float, D >, D >( names );
262 case itk::ImageIOBase::DOUBLE:
263 r = this->_GD1< itk::Point< double, D >, D >( names );
266 r = "ImageReader: Point type not supported.";
270 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
274 case itk::ImageIOBase::FLOAT:
275 r = this->_GD1< itk::CovariantVector< float, D >, D >( names );
277 case itk::ImageIOBase::DOUBLE:
278 r = this->_GD1< itk::CovariantVector< double, D >, D >( names );
281 r = "ImageReader: CovariantVector type not supported.";
285 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
289 case itk::ImageIOBase::FLOAT:
291 this->_GD1< itk::SymmetricSecondRankTensor< float, D >, D >(
295 case itk::ImageIOBase::DOUBLE:
297 this->_GD1< itk::SymmetricSecondRankTensor< double, D >, D >(
302 r = "ImageReader: Vector type not supported.";
306 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
310 case itk::ImageIOBase::FLOAT:
311 r = this->_GD1< itk::DiffusionTensor3D< float >, D >( names );
313 case itk::ImageIOBase::DOUBLE:
314 r = this->_GD1< itk::DiffusionTensor3D< double >, D >( names );
317 r = "ImageReader: Diffusion tensor type not supported.";
321 else if( pt == itk::ImageIOBase::COMPLEX )
325 case itk::ImageIOBase::FLOAT:
326 r = this->_GD1< std::complex< float >, D >( names );
328 case itk::ImageIOBase::DOUBLE:
329 r = this->_GD1< std::complex< double >, D >( names );
332 r = "ImageReader: Complex type not supported.";
336 else if( pt == itk::ImageIOBase::OFFSET )
337 r = this->_GD1< itk::Offset< D >, D >( names );
339 r = "ImageReader: Image pixel type not yet supported.";
341 itk::ImageIOBase::FIXEDARRAY
342 itk::ImageIOBase::MATRIX
347 // -------------------------------------------------------------------------
348 template< class P, unsigned int D >
349 std::string cpPlugins::IO::ImageReader::
350 _GD1( const TStringList& names )
352 if( this->m_Parameters->GetBool( "VectorType" ) )
353 return( this->_RealGD< itk::VectorImage< P, D > >( names ) );
355 return( this->_RealGD< itk::Image< P, D > >( names ) );
358 // -------------------------------------------------------------------------
360 std::string cpPlugins::IO::ImageReader::
361 _RealGD( const TStringList& names )
363 auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
365 return( "ImageReader: No output object properly created." );
368 if( names.size( ) == 1 )
371 typedef itk::ImageFileReader< I > _SR;
372 _SR* reader = this->_CreateITK< _SR >( );
373 reader->SetFileName( names[ 0 ] );
377 out->SetITK< I >( reader->GetOutput( ) );
378 out->SetName( names[ 0 ] );
380 catch( itk::ExceptionObject& err )
382 r = "ImageReader: " + std::string( err.GetDescription( ) );
383 out->SetITK< I >( NULL );
388 else if( names.size( ) > 1 )
391 typedef itk::ImageSeriesReader< I > _MR;
392 _MR* reader = this->_CreateITK< _MR >( );
393 for( unsigned int i = 0; i < names.size( ); ++i )
394 reader->AddFileName( names[ i ] );
398 out->SetITK< I >( reader->GetOutput( ) );
399 out->SetName( names[ 0 ] );
401 catch( itk::ExceptionObject& err )
403 r = "ImageReader: " + std::string( err.GetDescription( ) );
404 out->SetITK< I >( NULL );
410 r = "ImageReader: No image files given";