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