1 #include "ImageReader.h"
2 #include <cpPlugins/Interface/Image.h>
4 #include <itkImageFileReader.h>
5 #include <itkImageSeriesReader.h>
7 #ifdef cpPlugins_Interface_QT4
9 #endif // cpPlugins_Interface_QT4
11 // -------------------------------------------------------------------------
12 cpPlugins::IO::ImageReader::
13 DialogResult cpPlugins::IO::ImageReader::
14 ExecConfigurationDialog( QWidget* parent )
16 DialogResult r = Self::DialogResult_Cancel;
18 #ifdef cpPlugins_Interface_QT4
22 << "Image files (*.bmp *.png *.jpg *.jpeg *.dcm *.mhd *.nhdr *.nrrd *.tiff)"
25 std::vector< std::string > names;
26 this->m_Parameters->GetStringList( names, "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
53 // -------------------------------------------------------------------------
54 cpPlugins::IO::ImageReader::
58 this->_MakeOutput< cpPlugins::Interface::Image >( "Output" );
60 this->m_Parameters->ConfigureAsStringList( "FileNames" );
61 this->m_Parameters->ConfigureAsBool( "VectorType", false );
64 // -------------------------------------------------------------------------
65 cpPlugins::IO::ImageReader::
70 // -------------------------------------------------------------------------
71 std::string cpPlugins::IO::ImageReader::
76 this->m_Parameters->GetStringList( names, "FileNames" );
79 if( names.size( ) >= 1 )
81 // Guess image properties
82 itk::ImageIOBase::Pointer io =
83 itk::ImageIOFactory::CreateImageIO(
85 itk::ImageIOFactory::ReadMode
89 io->SetFileName( names[ 0 ] );
90 io->ReadImageInformation( );
91 if( names.size( ) >= 1 )
93 switch( io->GetNumberOfDimensions( ) )
95 case 2: r = this->_GD0< 2 >( io, names ); break;
96 case 3: r = this->_GD0< 3 >( io, names ); break;
97 case 4: r = this->_GD0< 4 >( io, names ); break;
99 r = "ImageReader: Image dimension not supported.";
106 r = "ImageReader: Could not CreateImageIO for \"" + names[ 0 ] + "\"";
109 r = "No image files given";
113 // -------------------------------------------------------------------------
114 template< unsigned int D >
115 std::string cpPlugins::IO::ImageReader::
116 _GD0( itk::ImageIOBase* io, const TStringList& names )
118 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
119 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
122 if( pt == itk::ImageIOBase::SCALAR )
126 case itk::ImageIOBase::UCHAR:
127 r = this->_GD1< unsigned char, D >( names );
129 case itk::ImageIOBase::CHAR:
130 r = this->_GD1< char, D >( names );
132 case itk::ImageIOBase::USHORT:
133 r = this->_GD1< unsigned short, D >( names );
135 case itk::ImageIOBase::SHORT:
136 r = this->_GD1< short, D >( names );
138 case itk::ImageIOBase::UINT:
139 r = this->_GD1< unsigned int, D >( names );
141 case itk::ImageIOBase::INT:
142 r = this->_GD1< int, D >( names );
144 case itk::ImageIOBase::ULONG:
145 r = this->_GD1< unsigned long, D >( names );
147 case itk::ImageIOBase::LONG:
148 r = this->_GD1< long, D >( names );
150 case itk::ImageIOBase::FLOAT:
151 r = this->_GD1< float, D >( names );
153 case itk::ImageIOBase::DOUBLE:
154 r = this->_GD1< double, D >( names );
157 r = "ImageReader: Scalar pixel type not supported.";
161 else if( pt == itk::ImageIOBase::RGB )
165 case itk::ImageIOBase::UCHAR:
166 r = this->_GD1< itk::RGBPixel< unsigned char >, D >( names );
168 case itk::ImageIOBase::CHAR:
169 r = this->_GD1< itk::RGBPixel< char >, D >( names );
171 case itk::ImageIOBase::USHORT:
172 r = this->_GD1< itk::RGBPixel< unsigned short >, D >( names );
174 case itk::ImageIOBase::SHORT:
175 r = this->_GD1< itk::RGBPixel< short >, D >( names );
177 case itk::ImageIOBase::UINT:
178 r = this->_GD1< itk::RGBPixel< unsigned int >, D >( names );
180 case itk::ImageIOBase::INT:
181 r = this->_GD1< itk::RGBPixel< int >, D >( names );
183 case itk::ImageIOBase::ULONG:
184 r = this->_GD1< itk::RGBPixel< unsigned long >, D >( names );
186 case itk::ImageIOBase::LONG:
187 r = this->_GD1< itk::RGBPixel< long >, D >( names );
189 case itk::ImageIOBase::FLOAT:
190 r = this->_GD1< itk::RGBPixel< float >, D >( names );
192 case itk::ImageIOBase::DOUBLE:
193 r = this->_GD1< itk::RGBPixel< double >, D >( names );
196 r = "ImageReader: RGB pixel type not supported.";
200 else if( pt == itk::ImageIOBase::RGBA )
204 case itk::ImageIOBase::UCHAR:
205 r = this->_GD1< itk::RGBAPixel< unsigned char >, D >( names );
207 case itk::ImageIOBase::CHAR:
208 r = this->_GD1< itk::RGBAPixel< char >, D >( names );
210 case itk::ImageIOBase::USHORT:
211 r = this->_GD1< itk::RGBAPixel< unsigned short >, D >( names );
213 case itk::ImageIOBase::SHORT:
214 r = this->_GD1< itk::RGBAPixel< short >, D >( names );
216 case itk::ImageIOBase::UINT:
217 r = this->_GD1< itk::RGBAPixel< unsigned int >, D >( names );
219 case itk::ImageIOBase::INT:
220 r = this->_GD1< itk::RGBAPixel< int >, D >( names );
222 case itk::ImageIOBase::ULONG:
223 r = this->_GD1< itk::RGBAPixel< unsigned long >, D >( names );
225 case itk::ImageIOBase::LONG:
226 r = this->_GD1< itk::RGBAPixel< long >, D >( names );
228 case itk::ImageIOBase::FLOAT:
229 r = this->_GD1< itk::RGBAPixel< float >, D >( names );
231 case itk::ImageIOBase::DOUBLE:
232 r = this->_GD1< itk::RGBAPixel< double >, D >( names );
235 r = "ImageReader: RGBA pixel type not supported.";
239 else if( pt == itk::ImageIOBase::VECTOR )
243 case itk::ImageIOBase::FLOAT:
244 r = this->_GD1< itk::Vector< float, D >, D >( names );
246 case itk::ImageIOBase::DOUBLE:
247 r = this->_GD1< itk::Vector< double, D >, D >( names );
250 r = "ImageReader: Vector type not supported.";
254 else if( pt == itk::ImageIOBase::POINT )
258 case itk::ImageIOBase::FLOAT:
259 r = this->_GD1< itk::Point< float, D >, D >( names );
261 case itk::ImageIOBase::DOUBLE:
262 r = this->_GD1< itk::Point< double, D >, D >( names );
265 r = "ImageReader: Point type not supported.";
269 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
273 case itk::ImageIOBase::FLOAT:
274 r = this->_GD1< itk::CovariantVector< float, D >, D >( names );
276 case itk::ImageIOBase::DOUBLE:
277 r = this->_GD1< itk::CovariantVector< double, D >, D >( names );
280 r = "ImageReader: CovariantVector type not supported.";
284 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
288 case itk::ImageIOBase::FLOAT:
290 this->_GD1< itk::SymmetricSecondRankTensor< float, D >, D >(
294 case itk::ImageIOBase::DOUBLE:
296 this->_GD1< itk::SymmetricSecondRankTensor< double, D >, D >(
301 r = "ImageReader: Vector type not supported.";
305 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
309 case itk::ImageIOBase::FLOAT:
310 r = this->_GD1< itk::DiffusionTensor3D< float >, D >( names );
312 case itk::ImageIOBase::DOUBLE:
313 r = this->_GD1< itk::DiffusionTensor3D< double >, D >( names );
316 r = "ImageReader: Diffusion tensor type not supported.";
320 else if( pt == itk::ImageIOBase::COMPLEX )
324 case itk::ImageIOBase::FLOAT:
325 r = this->_GD1< std::complex< float >, D >( names );
327 case itk::ImageIOBase::DOUBLE:
328 r = this->_GD1< std::complex< double >, D >( names );
331 r = "ImageReader: Complex type not supported.";
335 else if( pt == itk::ImageIOBase::OFFSET )
336 r = this->_GD1< itk::Offset< D >, D >( names );
338 r = "ImageReader: Image pixel type not yet supported.";
340 itk::ImageIOBase::FIXEDARRAY
341 itk::ImageIOBase::MATRIX
346 // -------------------------------------------------------------------------
347 template< class P, unsigned int D >
348 std::string cpPlugins::IO::ImageReader::
349 _GD1( const TStringList& names )
351 if( this->m_Parameters->GetBool( "VectorType" ) )
352 return( this->_RealGD< itk::VectorImage< P, D > >( names ) );
354 return( this->_RealGD< itk::Image< P, D > >( names ) );
357 // -------------------------------------------------------------------------
359 std::string cpPlugins::IO::ImageReader::
360 _RealGD( const TStringList& names )
362 cpPlugins::Interface::Image* out =
363 this->GetOutput< 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";