1 #include <cpPluginsIO/ImageReader.h>
2 #include <cpPlugins/Image.h>
3 #include <cpPlugins_Instances/ImagesIO.h>
4 #include <itkImageIOFactory.h>
6 // -------------------------------------------------------------------------
7 cpPluginsIO::ImageReader::
11 this->_AddOutput< cpPlugins::Image >( "Output" );
12 this->m_Parameters.Clear( );
13 this->m_Parameters.ConfigureAsOpenFileNameList( "FileNames" );
14 this->m_Parameters.SetAcceptedFileExtensions(
16 "Image files (*.bmp *.png *.jpg *.jpeg *.dcm *.mhd *.nhdr *.nrrd *.tiff)"
20 // -------------------------------------------------------------------------
21 cpPluginsIO::ImageReader::
26 // -------------------------------------------------------------------------
27 void cpPluginsIO::ImageReader::
31 auto fnames = this->m_Parameters.GetOpenFileNameList( "FileNames" );
32 if( fnames.size( ) >= 1 )
34 // Guess image properties
35 itk::ImageIOBase::Pointer io =
36 itk::ImageIOFactory::CreateImageIO(
38 itk::ImageIOFactory::ReadMode
42 io->SetFileName( fnames[ 0 ] );
43 io->ReadImageInformation( );
44 if( fnames.size( ) >= 1 )
46 switch( io->GetNumberOfDimensions( ) )
48 // TODO: case 1: r = this->_GD0< 1 >( io ); break;
49 case 2: this->_GD0< 2 >( io ); break;
50 case 3: this->_GD0< 3 >( io ); break;
51 // TODO: case 4: r = this->_GD0< 4 >( io ); break;
53 this->_Error( "Image dimension not supported." );
61 std::string( "Could not create an ImageIO for \"" ) +
67 this->_Error( "No image(s) given" );
70 // -------------------------------------------------------------------------
71 template< unsigned int _Dim >
72 void cpPluginsIO::ImageReader::
73 _GD0( itk::ImageIOBase* io )
75 typedef unsigned char uchar;
76 typedef unsigned short ushort;
77 typedef unsigned int uint;
78 typedef unsigned long ulong;
80 itk::ImageIOBase::IOComponentType ct = io->GetComponentType( );
81 itk::ImageIOBase::IOPixelType pt = io->GetPixelType( );
83 if( pt == itk::ImageIOBase::SCALAR )
87 case itk::ImageIOBase::CHAR : this->_GD1< char, _Dim >( io ); break;
88 case itk::ImageIOBase::SHORT : this->_GD1< short, _Dim >( io ); break;
89 case itk::ImageIOBase::INT : this->_GD1< int, _Dim >( io ); break;
90 case itk::ImageIOBase::LONG : this->_GD1< long, _Dim >( io ); break;
91 case itk::ImageIOBase::FLOAT : this->_GD1< float, _Dim >( io ); break;
92 case itk::ImageIOBase::DOUBLE : this->_GD1< double, _Dim >( io ); break;
93 case itk::ImageIOBase::UCHAR : this->_GD1< uchar, _Dim >( io ); break;
94 case itk::ImageIOBase::USHORT : this->_GD1< ushort, _Dim >( io ); break;
95 case itk::ImageIOBase::UINT : this->_GD1< uint, _Dim >( io ); break;
96 case itk::ImageIOBase::ULONG : this->_GD1< ulong, _Dim >( io ); break;
97 default: this->_Error( "Scalar pixel type not supported." ); break;
100 else if( pt == itk::ImageIOBase::RGB )
104 case itk::ImageIOBase::CHAR : this->_GD1< itk::RGBPixel< char >, _Dim >( io ); break;
105 case itk::ImageIOBase::SHORT : this->_GD1< itk::RGBPixel< short >, _Dim >( io ); break;
106 case itk::ImageIOBase::INT : this->_GD1< itk::RGBPixel< int >, _Dim >( io ); break;
107 case itk::ImageIOBase::LONG : this->_GD1< itk::RGBPixel< long >, _Dim >( io ); break;
108 case itk::ImageIOBase::FLOAT : this->_GD1< itk::RGBPixel< float >, _Dim >( io ); break;
109 case itk::ImageIOBase::DOUBLE : this->_GD1< itk::RGBPixel< double >, _Dim >( io ); break;
110 case itk::ImageIOBase::UCHAR : this->_GD1< itk::RGBPixel< uchar >, _Dim >( io ); break;
111 case itk::ImageIOBase::USHORT : this->_GD1< itk::RGBPixel< ushort >, _Dim >( io ); break;
112 case itk::ImageIOBase::UINT : this->_GD1< itk::RGBPixel< uint >, _Dim >( io ); break;
113 case itk::ImageIOBase::ULONG : this->_GD1< itk::RGBPixel< ulong >, _Dim >( io ); break;
114 default: this->_Error( "RGB pixel type not supported." ); break;
117 else if( pt == itk::ImageIOBase::RGBA )
121 case itk::ImageIOBase::CHAR : this->_GD1< itk::RGBAPixel< char >, _Dim >( io ); break;
122 case itk::ImageIOBase::SHORT : this->_GD1< itk::RGBAPixel< short >, _Dim >( io ); break;
123 case itk::ImageIOBase::INT : this->_GD1< itk::RGBAPixel< int >, _Dim >( io ); break;
124 case itk::ImageIOBase::LONG : this->_GD1< itk::RGBAPixel< long >, _Dim >( io ); break;
125 case itk::ImageIOBase::FLOAT : this->_GD1< itk::RGBAPixel< float >, _Dim >( io ); break;
126 case itk::ImageIOBase::DOUBLE : this->_GD1< itk::RGBAPixel< double >, _Dim >( io ); break;
127 case itk::ImageIOBase::UCHAR : this->_GD1< itk::RGBAPixel< uchar >, _Dim >( io ); break;
128 case itk::ImageIOBase::USHORT : this->_GD1< itk::RGBAPixel< ushort >, _Dim >( io ); break;
129 case itk::ImageIOBase::UINT : this->_GD1< itk::RGBAPixel< uint >, _Dim >( io ); break;
130 case itk::ImageIOBase::ULONG : this->_GD1< itk::RGBAPixel< ulong >, _Dim >( io ); break;
131 default: this->_Error( "RGBA pixel type not supported." ); break;
134 else if( pt == itk::ImageIOBase::COMPLEX )
138 case itk::ImageIOBase::FLOAT : this->_GD1< std::complex< float >, _Dim >( io ); break;
139 case itk::ImageIOBase::DOUBLE : this->_GD1< std::complex< double >, _Dim >( io ); break;
140 default: this->_Error( "Complex pixel type not supported." ); break;
144 else if( pt == itk::ImageIOBase::VECTOR )
147 else if( pt == itk::ImageIOBase::POINT )
150 else if( pt == itk::ImageIOBase::COVARIANTVECTOR )
153 else if( pt == itk::ImageIOBase::SYMMETRICSECONDRANKTENSOR )
156 else if( pt == itk::ImageIOBase::DIFFUSIONTENSOR3D )
159 else if( pt == itk::ImageIOBase::OFFSET )
162 else if( pt == itk::ImageIOBase::FIXEDARRAY )
165 else if( pt == itk::ImageIOBase::MATRIX )
170 this->_Error( "Image pixel type not yet supported." );
173 // -------------------------------------------------------------------------
174 template< class _TPixel, unsigned int _Dim >
175 void cpPluginsIO::ImageReader::
176 _GD1( itk::ImageIOBase* io )
178 typedef itk::Image< _TPixel, _Dim > _TImage;
181 auto fnames = this->m_Parameters.GetOpenFileNameList( "FileNames" );
182 if( fnames.size( ) == 1 )
184 auto f = this->_CreateITK< itk::ImageFileReader< _TImage > >( );
185 f->SetFileName( fnames[ 0 ] );
190 this->GetOutput( "Output" )->SetITK( f->GetOutput( ) );
192 catch( itk::ExceptionObject& err )
194 this->_Error( err.GetDescription( ) );
197 else // if( fnames.size( ) > 1 )
199 auto f = this->_CreateITK< itk::ImageSeriesReader< _TImage > >( );
200 for( auto i = fnames.begin( ); i != fnames.end( ); ++i )
201 f->AddFileName( *i );
206 this->GetOutput( "Output" )->SetITK( f->GetOutput( ) );
208 catch( itk::ExceptionObject& err )
210 this->_Error( err.GetDescription( ) );