18 #ifndef itkImageFileReaderKW_hxx    19 #define itkImageFileReaderKW_hxx    20 #include "itkImageFileReaderKW.h"    22 #include "itkObjectFactory.h"    23 #include "itkImageIOFactory.h"    24 #include "itkConvertPixelBuffer.h"    25 #include "itkPixelTraits.h"    26 #include "itkVectorImage.h"    28 #include "itksys/SystemTools.hxx"    33     template< 
typename TOutputImage, 
typename ConvertPixelTraits >
    34     ImageFileReaderKW< TOutputImage, ConvertPixelTraits >
    37         m_ImageIO = ITK_NULLPTR;
    38         this->SetFileName(
"");
    39         m_UserSpecifiedImageIO = 
false;
    40         m_UseStreaming = 
true;
    43     template< 
typename TOutputImage, 
typename ConvertPixelTraits >
    44     ImageFileReaderKW< TOutputImage, ConvertPixelTraits >
    45     ::~ImageFileReaderKW()
    48     template< 
typename TOutputImage, 
typename ConvertPixelTraits >
    49     void ImageFileReaderKW< TOutputImage, ConvertPixelTraits >
    50     ::PrintSelf(std::ostream & os, Indent indent)
 const    52         Superclass::PrintSelf(os, indent);
    54         itkPrintSelfObjectMacro( ImageIO );
    56         os << indent << 
"UserSpecifiedImageIO flag: " << m_UserSpecifiedImageIO << 
"\n";
    57         os << indent << 
"m_UseStreaming: " << m_UseStreaming << 
"\n";
    60     template< 
typename TOutputImage, 
typename ConvertPixelTraits >
    65         itkDebugMacro(
"setting ImageIO to " << imageIO);
    66         if ( this->m_ImageIO != imageIO )
    68             this->m_ImageIO = imageIO;
    71         m_UserSpecifiedImageIO = 
true;
    74     template< 
typename TOutputImage, 
typename ConvertPixelTraits >
    79         typename TOutputImage::Pointer output = this->GetOutput();
    81         itkDebugMacro(<< 
"Reading file for GenerateOutputInformation()" << this->GetFileName());
    85         if ( this->GetFileName() == 
"" )
    87             throw ImageFileReaderException(__FILE__, __LINE__, 
"FileName must be specified", ITK_LOCATION);
    97             m_ExceptionMessage = 
"";
    98             this->TestFileExistanceAndReadability();
   100         catch ( itk::ExceptionObject & err )
   102             m_ExceptionMessage = err.GetDescription();
   105 #if !defined(SPECIFIC_IMAGEIO_MODULE_TEST)   106         if ( m_UserSpecifiedImageIO == 
false ) 
   108             m_ImageIO = ImageIOFactory::CreateImageIO(this->GetFileName().c_str(), ImageIOFactory::ReadMode);
   112         if ( m_ImageIO.IsNull() )
   114             std::ostringstream msg;
   115             msg << 
" Could not create IO object for reading file "   116                 << this->GetFileName().c_str() << std::endl;
   117             if ( m_ExceptionMessage.size() )
   119                 msg << m_ExceptionMessage;
   123                 std::list< LightObject::Pointer > allobjects =
   124                         ObjectFactoryBase::CreateAllInstance(
"itkImageIOBase");
   125                 if (allobjects.size() > 0)
   127                     msg << 
"  Tried to create one of the following:" << std::endl;
   128                     for ( std::list< LightObject::Pointer >::iterator i = allobjects.begin();
   129                           i != allobjects.end(); ++i )
   131                         ImageIOBase *io = 
dynamic_cast< ImageIOBase * 
>( i->GetPointer() );
   132                         msg << 
"    " << io->GetNameOfClass() << std::endl;
   134                     msg << 
"  You probably failed to set a file suffix, or" << std::endl;
   135                     msg << 
"    set the suffix to an unsupported type." << std::endl;
   139                     msg << 
"  There are no registered IO factories." << std::endl;
   140                     msg << 
"  Please visit https://www.itk.org/Wiki/ITK/FAQ#NoFactoryException to diagnose the problem." << std::endl;
   143             ImageFileReaderException e(__FILE__, __LINE__, msg.str().c_str(), ITK_LOCATION);
   151         m_ImageIO->SetFileName( this->GetFileName().c_str() );
   152         m_ImageIO->ReadImageInformation();
   155         double   spacing[TOutputImage::ImageDimension];
   156         double   origin[TOutputImage::ImageDimension];
   157         typename TOutputImage::DirectionType direction;
   159         std::vector< std::vector< double > > directionIO;
   161         const unsigned int numberOfDimensionsIO = m_ImageIO->GetNumberOfDimensions();
   163         if ( numberOfDimensionsIO > TOutputImage::ImageDimension )
   165             for ( 
unsigned int k = 0; k < numberOfDimensionsIO; ++k )
   167                 directionIO.push_back( m_ImageIO->GetDefaultDirection(k) );
   172             for ( 
unsigned int k = 0; k < numberOfDimensionsIO; ++k )
   174                 directionIO.push_back( m_ImageIO->GetDirection(k) );
   178         std::vector< double > axis;
   180         for ( 
unsigned int i = 0; i < TOutputImage::ImageDimension; ++i )
   182             if ( i < numberOfDimensionsIO )
   184                 dimSize[i] = m_ImageIO->GetDimensions(i);
   185                 spacing[i] = m_ImageIO->GetSpacing(i);
   188                 if (spacing[i] == 0) {
   192                 origin[i]  = m_ImageIO->GetOrigin(i);
   196                 axis = directionIO[i];
   197                 for ( 
unsigned j = 0; j < TOutputImage::ImageDimension; ++j )
   199                     if ( j < numberOfDimensionsIO )
   201                         direction[j][i] = axis[j];
   205                         direction[j][i] = 0.0;
   217                 for ( 
unsigned j = 0; j < TOutputImage::ImageDimension; ++j )
   221                         direction[j][i] = 1.0;
   225                         direction[j][i] = 0.0;
   232         for ( 
unsigned int i = 0; i < TOutputImage::ImageDimension; ++i )
   236                 spacing[i] = -spacing[i];
   237                 for ( 
unsigned j = 0; j < TOutputImage::ImageDimension; ++j )
   239                     direction[j][i] = -direction[j][i];
   243         output->SetSpacing(spacing);       
   244         output->SetOrigin(origin);         
   245         output->SetDirection(direction);   
   248         output->SetMetaDataDictionary( m_ImageIO->GetMetaDataDictionary() );
   249         this->SetMetaDataDictionary( m_ImageIO->GetMetaDataDictionary() );
   255         region.SetSize(dimSize);
   256         region.SetIndex(start);
   260         if ( strcmp(output->GetNameOfClass(), 
"VectorImage") == 0 )
   262             typedef typename TOutputImage::AccessorFunctorType AccessorFunctorType;
   263             AccessorFunctorType::SetVectorLength( output, m_ImageIO->GetNumberOfComponents() );
   266         output->SetLargestPossibleRegion(region);
   269     template< 
typename TOutputImage, 
typename ConvertPixelTraits >
   275         if ( !itksys::SystemTools::FileExists( this->GetFileName().c_str() ) )
   277             ImageFileReaderException e(__FILE__, __LINE__);
   278             std::ostringstream       msg;
   279             msg << 
"The file doesn't exist. "   280                 << std::endl << 
"Filename = " << this->GetFileName()
   282             e.SetDescription( msg.str().c_str() );
   288         std::ifstream readTester;
   289         readTester.open( this->GetFileName().c_str() );
   290         if ( readTester.fail() )
   293             std::ostringstream msg;
   294             msg << 
"The file couldn't be opened for reading. "   295                 << std::endl << 
"Filename: " << this->GetFileName()
   297             ImageFileReaderException e(__FILE__, __LINE__, msg.str().c_str(), ITK_LOCATION);
   304     template< 
typename TOutputImage, 
typename ConvertPixelTraits >
   309         itkDebugMacro (<< 
"Starting EnlargeOutputRequestedRegion() ");
   310         typename TOutputImage::Pointer out = 
dynamic_cast< TOutputImage * 
>( output );
   311         typename TOutputImage::RegionType largestRegion = out->GetLargestPossibleRegion();
   317         ImageIORegion   ioRequestedRegion(TOutputImage::ImageDimension);
   319         typedef ImageIORegionAdaptor< TOutputImage::ImageDimension > ImageIOAdaptor;
   321         ImageIOAdaptor::Convert( imageRequestedRegion, ioRequestedRegion, largestRegion.GetIndex() );
   324         m_ImageIO->SetUseStreamedReading(m_UseStreaming);
   329                 m_ImageIO->GenerateStreamableReadRegionFromRequestedRegion(ioRequestedRegion);
   339         ImageIOAdaptor::Convert( m_ActualIORegion, streamableRegion, largestRegion.GetIndex() );
   346         if ( !streamableRegion.IsInside(imageRequestedRegion)
   347              && imageRequestedRegion.GetNumberOfPixels() != 0 )
   352             std::ostringstream message;
   353             message << 
"ImageIO returns IO region that does not fully contain the requested region"   354                     << 
"Requested region: " << imageRequestedRegion
   355                     << 
"StreamableRegion region: " << streamableRegion;
   356             InvalidRequestedRegionError e(__FILE__, __LINE__);
   357             e.SetLocation(ITK_LOCATION);
   358             e.SetDescription( message.str().c_str() );
   363                 << 
"RequestedRegion is set to:" << streamableRegion << 
" while the m_ActualIORegion is: " << m_ActualIORegion);
   365         out->SetRequestedRegion(streamableRegion);
   368     template< 
typename TOutputImage, 
typename ConvertPixelTraits >
   372         this->UpdateProgress( 0.0f );
   374         typename TOutputImage::Pointer output = this->GetOutput();
   376         itkDebugMacro (<< 
"ImageFileReaderKW::GenerateData() \n"   377                                << 
"Allocating the buffer with the EnlargedRequestedRegion \n"   378                                << output->GetRequestedRegion() << 
"\n");
   381         this->AllocateOutputs();
   391             m_ExceptionMessage = 
"";
   392             this->TestFileExistanceAndReadability();
   394         catch ( itk::ExceptionObject & err )
   396             m_ExceptionMessage = err.GetDescription();
   400         m_ImageIO->SetFileName( this->GetFileName().c_str() );
   402         itkDebugMacro (<< 
"Setting imageIO IORegion to: " << m_ActualIORegion);
   403         m_ImageIO->SetIORegion(m_ActualIORegion);
   405         char *loadBuffer = ITK_NULLPTR;
   409         size_t sizeOfActualIORegion = m_ActualIORegion.GetNumberOfPixels()
   410                                       * ( m_ImageIO->GetComponentSize() * m_ImageIO->GetNumberOfComponents() );
   414             ImageIOBase::IOComponentType ioType =
   416                     ::MapPixelType< typename ConvertPixelTraits::ComponentType >::CType;
   417             if ( m_ImageIO->GetComponentType() != ioType
   418                  || ( m_ImageIO->GetNumberOfComponents() !=
   419                       ConvertPixelTraits::GetNumberOfComponents() ) )
   423                 itkDebugMacro( << 
"Buffer conversion required from: "   424                                        << m_ImageIO->GetComponentTypeAsString(m_ImageIO->GetComponentType())
   426                                        << m_ImageIO->GetComponentTypeAsString(ioType)
   427                                        << 
" ConvertPixelTraits::NumComponents "   428                                        << ConvertPixelTraits::GetNumberOfComponents()
   429                                        << 
" m_ImageIO->NumComponents "   430                                        << m_ImageIO->GetNumberOfComponents() );
   432                 loadBuffer = 
new char[sizeOfActualIORegion];
   433                 m_ImageIO->Read( static_cast< void * >( loadBuffer ) );
   437                 this->DoConvertBuffer( static_cast< void * >( loadBuffer ),
   438                                        output->GetBufferedRegion().GetNumberOfPixels() );
   440             else if ( m_ActualIORegion.GetNumberOfPixels() !=
   441                       output->GetBufferedRegion().GetNumberOfPixels() )
   448                 itkDebugMacro(<< 
"Buffer required because file dimension is greater then image dimension");
   452                 loadBuffer = 
new char[sizeOfActualIORegion];
   453                 m_ImageIO->Read( static_cast< void * >( loadBuffer ) );
   457                 std::copy(reinterpret_cast< const OutputImagePixelType * >( loadBuffer ),
   458                           reinterpret_cast< const OutputImagePixelType * >( loadBuffer ) + output->GetBufferedRegion().GetNumberOfPixels(),
   463                 itkDebugMacro(<< 
"No buffer conversion required.");
   466                 m_ImageIO->Read(outputBuffer);
   475             loadBuffer = ITK_NULLPTR;
   481         this->UpdateProgress( 1.0f );
   485         loadBuffer = ITK_NULLPTR;
   488     template< 
typename TOutputImage, 
typename ConvertPixelTraits >
   492                       size_t numberOfPixels)
   496                 this->GetOutput()->GetPixelContainer()->GetBufferPointer();
   497         bool isVectorImage(strcmp(this->GetOutput()->GetNameOfClass(),
   498                                   "VectorImage") == 0);
   514 #define ITK_CONVERT_BUFFER_IF_BLOCK(_CType,type)                        \   515   else if(m_ImageIO->GetComponentType() == _CType)                      \   519       ConvertPixelBuffer<type,                                          \   520                          OutputImagePixelType,                          \   523         ::ConvertVectorImage(static_cast< type * >( inputData ),        \   524                              m_ImageIO->GetNumberOfComponents(),        \   530       ConvertPixelBuffer<type,                                          \   531                          OutputImagePixelType,                          \   534         ::Convert(static_cast< type * >( inputData ),                   \   535                   m_ImageIO->GetNumberOfComponents(),                   \   542         ITK_CONVERT_BUFFER_IF_BLOCK(ImageIOBase::UCHAR,
unsigned char)
   543         ITK_CONVERT_BUFFER_IF_BLOCK(ImageIOBase::CHAR,
char)
   544         ITK_CONVERT_BUFFER_IF_BLOCK(ImageIOBase::USHORT,
unsigned short)
   545         ITK_CONVERT_BUFFER_IF_BLOCK(ImageIOBase::SHORT,
short)
   546         ITK_CONVERT_BUFFER_IF_BLOCK(ImageIOBase::UINT,
unsigned int)
   547         ITK_CONVERT_BUFFER_IF_BLOCK(ImageIOBase::INT,
int)
   548         ITK_CONVERT_BUFFER_IF_BLOCK(ImageIOBase::ULONG,
unsigned long)
   549         ITK_CONVERT_BUFFER_IF_BLOCK(ImageIOBase::LONG,
long)
   550         ITK_CONVERT_BUFFER_IF_BLOCK(ImageIOBase::FLOAT,
float)
   551         ITK_CONVERT_BUFFER_IF_BLOCK(ImageIOBase::DOUBLE,
double)
   554 #define TYPENAME(x)                                     \   555     m_ImageIO->GetComponentTypeAsString                 \   556       (ImageIOBase::MapPixelType<x>::CType)   558             ImageFileReaderException e(__FILE__, __LINE__);
   559             std::ostringstream       msg;
   560             msg << 
"Couldn't convert component type: "   562                 << m_ImageIO->GetComponentTypeAsString( m_ImageIO->GetComponentType() )
   563                 << std::endl << 
"to one of: "   564                 << std::endl << 
"    " << TYPENAME( 
unsigned char )
   565                 << std::endl << 
"    " << TYPENAME( 
char )
   566                 << std::endl << 
"    " << TYPENAME( 
unsigned short )
   567                 << std::endl << 
"    " << TYPENAME( 
short )
   568                 << std::endl << 
"    " << TYPENAME( 
unsigned int )
   569                 << std::endl << 
"    " << TYPENAME( 
int )
   570                 << std::endl << 
"    " << TYPENAME( 
unsigned long )
   571                 << std::endl << 
"    " << TYPENAME( 
long )
   572                 << std::endl << 
"    " << TYPENAME( 
float )
   573                 << std::endl << 
"    " << TYPENAME( 
double )
   575             e.SetDescription( msg.str().c_str() );
   576             e.SetLocation(ITK_LOCATION);
   580 #undef ITK_CONVERT_BUFFER_IF_BLOCK TOutputImage::InternalPixelType OutputImagePixelType
Definition: itkImageFileReaderKW.h:100
 
TOutputImage::RegionType ImageRegionType
Definition: itkImageFileReaderKW.h:97
 
TOutputImage::SizeType SizeType
Definition: itkImageFileReaderKW.h:91
 
virtual void GenerateOutputInformation(void) ITK_OVERRIDE
Definition: itkImageFileReaderKW.hxx:77
 
Definition: itkImageFileReaderKW.h:31
 
virtual void GenerateData() ITK_OVERRIDE
Definition: itkImageFileReaderKW.hxx:370
 
virtual void EnlargeOutputRequestedRegion(DataObject *output) ITK_OVERRIDE
Definition: itkImageFileReaderKW.hxx:307
 
void TestFileExistanceAndReadability()
Definition: itkImageFileReaderKW.hxx:272
 
void SetImageIO(ImageIOBase *imageIO)
Definition: itkImageFileReaderKW.hxx:63
 
TOutputImage::IndexType IndexType
Definition: itkImageFileReaderKW.h:94
 
void DoConvertBuffer(void *buffer, size_t numberOfPixels)
Definition: itkImageFileReaderKW.hxx:491