1 #include <ITKIO/ImageReader.h>
2 #include <cpInstances/Image.h>
3 #include <cpPlugins/QT/OpenFileDialog.h>
5 #define ITKIOImageBase_HIDDEN
6 #include <itkImageFileReader.h>
7 #include <itkImageSeriesReader.h>
8 #include <itkImageIOFactory.h>
11 # include <QApplication>
12 #endif // cpPlugins_QT4
14 // -------------------------------------------------------------------------
15 QDialog* cpPluginsITKIO::ImageReader::
19 cpPlugins::QT::OpenFileDialog* dlg = NULL;
20 if( QApplication::instance( ) != NULL )
22 dlg = new cpPlugins::QT::OpenFileDialog( );
23 dlg->SetParameters( &( this->m_Parameters ), "FileNames" );
27 #else // cpPlugins_QT4
29 #endif // cpPlugins_QT4
32 // -------------------------------------------------------------------------
33 cpPluginsITKIO::ImageReader::
37 this->_ConfigureOutput< cpInstances::Image >( "Output" );
38 this->m_Parameters.Clear( );
39 this->m_Parameters.ConfigureAsOpenFileNameList( "FileNames" );
40 this->m_Parameters.SetAcceptedFileExtensions(
42 "Image files (*.bmp *.png *.jpg *.jpeg *.dcm *.mhd *.nhdr *.nrrd *.tiff)"
46 // -------------------------------------------------------------------------
47 cpPluginsITKIO::ImageReader::
52 // -------------------------------------------------------------------------
53 void cpPluginsITKIO::ImageReader::
57 auto fnames = this->m_Parameters.GetOpenFileNameList( "FileNames" );
58 std::string fname = "";
59 if( fnames.size( ) > 1 )
61 std::stringstream fname_str;
62 fname_str << fnames[ 0 ] << cpPlugins_PATH_SEPARATOR << fnames[ 1 ];
63 fname = fname_str.str( );
65 else if( fnames.size( ) == 1 )
70 // Guess image properties
71 itk::ImageIOBase::Pointer io =
72 itk::ImageIOFactory::CreateImageIO(
73 fname.c_str( ), itk::ImageIOFactory::ReadMode
77 io->SetFileName( fname );
78 io->ReadImageInformation( );
80 unsigned int dim = io->GetNumberOfDimensions( );
81 #ifdef cpPlugins_CONFIG_PROCESS_DIMENSIONS_1
82 if( dim == 1 ) success = this->_GD0< 1 >( io );
83 #endif // cpPlugins_CONFIG_PROCESS_DIMENSIONS_1
84 #ifdef cpPlugins_CONFIG_PROCESS_DIMENSIONS_2
85 if( dim == 2 ) success = this->_GD0< 2 >( io );
86 #endif // cpPlugins_CONFIG_PROCESS_DIMENSIONS_2
87 #ifdef cpPlugins_CONFIG_PROCESS_DIMENSIONS_3
88 if( dim == 3 ) success = this->_GD0< 3 >( io );
89 #endif // cpPlugins_CONFIG_PROCESS_DIMENSIONS_3
90 #ifdef cpPlugins_CONFIG_PROCESS_DIMENSIONS_4
91 if( dim == 4 ) success = this->_GD0< 4 >( io );
92 #endif // cpPlugins_CONFIG_PROCESS_DIMENSIONS_4
94 this->_Error( "Image dimension not supported." );
98 std::string( "Could not create an ImageIO for \"" ) +
104 this->_Error( "No image(s) given" );
107 // -------------------------------------------------------------------------
108 template< unsigned int _Dim >
109 bool cpPluginsITKIO::ImageReader::
110 _GD0( itk::ImageIOBase* io )
112 typedef unsigned char uchar;
113 typedef unsigned short ushort;
114 typedef unsigned int uint;
115 typedef unsigned long ulong;
117 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
118 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
120 bool success = false;
121 if( pt == itk::ImageIOBase::SCALAR )
123 if( ct == itk::ImageIOBase::CHAR ) success = this->_GD1< char, _Dim >( io );
124 if( ct == itk::ImageIOBase::UCHAR ) success = this->_GD1< uchar, _Dim >( io );
125 if( ct == itk::ImageIOBase::SHORT ) success = this->_GD1< short, _Dim >( io );
126 if( ct == itk::ImageIOBase::USHORT ) success = this->_GD1< ushort, _Dim >( io );
127 if( ct == itk::ImageIOBase::INT ) success = this->_GD1< int, _Dim >( io );
128 if( ct == itk::ImageIOBase::UINT ) success = this->_GD1< uint, _Dim >( io );
129 if( ct == itk::ImageIOBase::LONG ) success = this->_GD1< long, _Dim >( io );
130 if( ct == itk::ImageIOBase::ULONG ) success = this->_GD1< ulong, _Dim >( io );
131 if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< float, _Dim >( io );
132 if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< double, _Dim >( io );
134 else if( pt == itk::ImageIOBase::RGB )
136 if( ct == itk::ImageIOBase::CHAR ) success = this->_GD1< itk::RGBPixel< char >, _Dim >( io );
137 if( ct == itk::ImageIOBase::UCHAR ) success = this->_GD1< itk::RGBPixel< uchar >, _Dim >( io );
138 if( ct == itk::ImageIOBase::SHORT ) success = this->_GD1< itk::RGBPixel< short >, _Dim >( io );
139 if( ct == itk::ImageIOBase::USHORT ) success = this->_GD1< itk::RGBPixel< ushort >, _Dim >( io );
140 if( ct == itk::ImageIOBase::INT ) success = this->_GD1< itk::RGBPixel< int >, _Dim >( io );
141 if( ct == itk::ImageIOBase::UINT ) success = this->_GD1< itk::RGBPixel< uint >, _Dim >( io );
142 if( ct == itk::ImageIOBase::LONG ) success = this->_GD1< itk::RGBPixel< long >, _Dim >( io );
143 if( ct == itk::ImageIOBase::ULONG ) success = this->_GD1< itk::RGBPixel< ulong >, _Dim >( io );
144 if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< itk::RGBPixel< float >, _Dim >( io );
145 if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< itk::RGBPixel< double >, _Dim >( io );
147 else if( pt == itk::ImageIOBase::RGBA )
149 if( ct == itk::ImageIOBase::CHAR ) success = this->_GD1< itk::RGBAPixel< char >, _Dim >( io );
150 if( ct == itk::ImageIOBase::UCHAR ) success = this->_GD1< itk::RGBAPixel< uchar >, _Dim >( io );
151 if( ct == itk::ImageIOBase::SHORT ) success = this->_GD1< itk::RGBAPixel< short >, _Dim >( io );
152 if( ct == itk::ImageIOBase::USHORT ) success = this->_GD1< itk::RGBAPixel< ushort >, _Dim >( io );
153 if( ct == itk::ImageIOBase::INT ) success = this->_GD1< itk::RGBAPixel< int >, _Dim >( io );
154 if( ct == itk::ImageIOBase::UINT ) success = this->_GD1< itk::RGBAPixel< uint >, _Dim >( io );
155 if( ct == itk::ImageIOBase::LONG ) success = this->_GD1< itk::RGBAPixel< long >, _Dim >( io );
156 if( ct == itk::ImageIOBase::ULONG ) success = this->_GD1< itk::RGBAPixel< ulong >, _Dim >( io );
157 if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< itk::RGBAPixel< float >, _Dim >( io );
158 if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< itk::RGBAPixel< double >, _Dim >( io );
160 else if( pt == itk::ImageIOBase::COMPLEX )
162 if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< std::complex< float >, _Dim >( io );
163 if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< std::complex< double >, _Dim >( io );
165 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
167 if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< itk::CovariantVector< float, _Dim >, _Dim >( io );
168 if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< itk::CovariantVector< double, _Dim >, _Dim >( io );
170 else if( pt == itk::ImageIOBase::POINT )
172 if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< itk::Point< float, _Dim >, _Dim >( io );
173 if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< itk::Point< double, _Dim >, _Dim >( io );
175 else if( pt == itk::ImageIOBase::VECTOR )
177 if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< itk::Vector< float, _Dim >, _Dim >( io );
178 if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< itk::Vector< double, _Dim >, _Dim >( io );
180 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
182 if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< itk::SymmetricSecondRankTensor< float, _Dim >, _Dim >( io );
183 if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< itk::SymmetricSecondRankTensor< double, _Dim >, _Dim >( io );
185 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
189 if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< itk::DiffusionTensor3D< float >, _Dim >( io );
190 if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< itk::DiffusionTensor3D< double >, _Dim >( io );
193 this->_Error( "DiffusionTensor3D dimension not supported." );
195 else if( pt == itk::ImageIOBase::MATRIX )
197 if( ct == itk::ImageIOBase::FLOAT ) success = this->_GD1< itk::Matrix< float, _Dim, _Dim >, _Dim >( io );
198 if( ct == itk::ImageIOBase::DOUBLE ) success = this->_GD1< itk::Matrix< double, _Dim, _Dim >, _Dim >( io );
200 else if( pt == itk::ImageIOBase::OFFSET )
202 this->_GD1< itk::Offset< _Dim >, _Dim >( io );
204 else if( pt == itk::ImageIOBase::FIXEDARRAY )
210 // -------------------------------------------------------------------------
211 template< class _TPixel, unsigned int _Dim >
212 bool cpPluginsITKIO::ImageReader::
213 _GD1( itk::ImageIOBase* io )
215 typedef itk::Image< _TPixel, _Dim > _TImage;
218 auto fnames = this->m_Parameters.GetOpenFileNameList( "FileNames" );
219 if( fnames.size( ) == 1 || fnames.size( ) == 2 )
221 std::stringstream fname_str;
222 if( fnames.size( ) == 1 )
223 fname_str << fnames[ 0 ];
225 fname_str << fnames[ 0 ] << cpPlugins_PATH_SEPARATOR << fnames[ 1 ];
227 auto f = this->_CreateITK< itk::ImageFileReader< _TImage > >( );
228 f->SetFileName( fname_str.str( ) );
233 this->GetOutput( "Output" )->SetITK( f->GetOutput( ) );
236 catch( itk::ExceptionObject& err )
238 this->_Error( err.GetDescription( ) );
243 else // if( fnames.size( ) > 1 )
245 auto f = this->_CreateITK< itk::ImageSeriesReader< _TImage > >( );
246 auto i = fnames.begin( );
247 std::stringstream dir;
248 dir << *i << cpPlugins_PATH_SEPARATOR;
250 for( ; i != fnames.end( ); ++i )
251 f->AddFileName( dir.str( ) + *i );
256 this->GetOutput( "Output" )->SetITK( f->GetOutput( ) );
259 catch( itk::ExceptionObject& err )
261 this->_Error( err.GetDescription( ) );