17 #ifndef __itkImageFileWriter_txx
18 #define __itkImageFileWriter_txx
25 #include "vnl/vnl_vector.h"
34 template <
class TInputImage>
37 m_PasteIORegion(TInputImage::ImageDimension)
39 m_UseCompression =
false;
40 m_UseInputMetaDataDictionary =
true;
41 m_FactorySpecifiedImageIO =
false;
42 m_UserSpecifiedIORegion =
false;
43 m_UserSpecifiedImageIO =
false;
44 m_NumberOfStreamDivisions = 1;
48 template <
class TInputImage>
55 template <
class TInputImage>
62 const_cast<TInputImage *>(input ) );
67 template <
class TInputImage>
72 if (this->GetNumberOfInputs() < 1)
77 return static_cast<TInputImage*
>
82 template <
class TInputImage>
91 template <
class TInputImage>
96 itkDebugMacro(
"setting IORegion to " << region );
97 if ( m_PasteIORegion != region)
99 m_PasteIORegion = region;
101 m_UserSpecifiedIORegion =
true;
106 template <
class TInputImage>
113 itkDebugMacro( <<
"Writing an image file" );
118 itkExceptionMacro(<<
"No input to writer!");
123 if ( m_FileName ==
"" )
125 itkExceptionMacro(<<
"No filename was specified");
128 if ( m_ImageIO.IsNull() )
130 itkDebugMacro(<<
"Attempting factory creation of ImageIO for file: "
134 m_FactorySpecifiedImageIO =
true;
138 if( m_FactorySpecifiedImageIO && !m_ImageIO->CanWriteFile( m_FileName.c_str() ) )
140 itkDebugMacro(<<
"ImageIO exists but doesn't know how to write file:"
142 itkDebugMacro(<<
"Attempting creation of ImageIO with a factory for file:"
146 m_FactorySpecifiedImageIO =
true;
150 if ( m_ImageIO.IsNull() )
154 msg <<
" Could not create IO object for file "
155 << m_FileName.c_str() << std::endl;
156 msg <<
" Tried to create one of the following:" << std::endl;
158 std::list<LightObject::Pointer> allobjects =
160 for(std::list<LightObject::Pointer>::iterator i = allobjects.begin();
161 i != allobjects.end(); ++i)
167 msg <<
" You probably failed to set a file suffix, or" << std::endl;
168 msg <<
" set the suffix to an unsupported type." << std::endl;
179 nonConstInput->UpdateOutputInformation();
183 m_ImageIO->SetNumberOfDimensions(TInputImage::ImageDimension);
185 const typename TInputImage::SpacingType& spacing = input->GetSpacing();
186 const typename TInputImage::DirectionType& direction = input->GetDirection();
189 const typename TInputImage::IndexType& startIndex = largestRegion.GetIndex();
190 typename TInputImage::PointType origin;
191 input->TransformIndexToPhysicalPoint(startIndex, origin);
194 for(
unsigned int i=0; i<TInputImage::ImageDimension; i++)
196 m_ImageIO->SetDimensions(i,largestRegion.GetSize(i));
197 m_ImageIO->SetSpacing(i,spacing[i]);
198 m_ImageIO->SetOrigin(i,origin[i]);
202 for(
unsigned int j=0; j<TInputImage::ImageDimension; j++)
204 axisDirection[j] = direction[j][i];
206 m_ImageIO->SetDirection( i, axisDirection );
210 m_ImageIO->SetUseCompression(m_UseCompression);
213 if( m_UseInputMetaDataDictionary )
215 m_ImageIO->SetMetaDataDictionary(input->GetMetaDataDictionary());
220 if( strcmp( input->GetNameOfClass(),
"VectorImage" ) == 0 )
222 typedef typename InputImageType::InternalPixelType VectorImageScalarType;
223 m_ImageIO->SetPixelTypeInfo(
typeid(VectorImageScalarType) );
225 typedef typename InputImageType::AccessorFunctorType AccessorFunctorType;
226 m_ImageIO->SetNumberOfComponents( AccessorFunctorType::GetVectorLength(input) );
236 m_ImageIO->SetFileName(m_FileName.c_str());
241 if (m_NumberOfStreamDivisions > 1 || m_UserSpecifiedIORegion)
243 m_ImageIO->SetUseStreamedWriting(
true);
254 if ( m_UserSpecifiedIORegion )
256 pasteIORegion = m_PasteIORegion;
260 pasteIORegion = largestIORegion;
266 if( !largestIORegion.
IsInside( pasteIORegion ) )
269 <<
"Largest possible region does not fully contain requested paste IO region"
270 <<
"Paste IO region: " << pasteIORegion
271 <<
"Largest possible region: " << largestRegion);
276 unsigned int numDivisions;
279 numDivisions = m_ImageIO->GetActualNumberOfSplitsForWriting(m_NumberOfStreamDivisions,
291 piece < numDivisions && !this->GetAbortGenerateData();
296 ImageIORegion streamIORegion = m_ImageIO->GetSplitRegionForWriting(piece, numDivisions,
297 pasteIORegion, largestIORegion);
301 if( !pasteIORegion.IsInside( streamIORegion ) )
304 <<
"ImageIO returns streamable region that is not fully contain in paste IO region"
305 <<
"Paste IO region: " << pasteIORegion
306 <<
"Streamable region: " << streamIORegion);
316 nonConstInput->SetRequestedRegion(streamRegion);
317 nonConstInput->PropagateRequestedRegion();
318 nonConstInput->UpdateOutputData();
321 if (piece == 0 && streamRegion != largestRegion)
324 if (bufferedRegion == largestRegion)
327 itkDebugMacro(
"Requested stream region matches largest region input filter may not support streaming well.");
328 itkDebugMacro(
"Writer is not streaming now!");
330 streamRegion = largestRegion;
336 m_ImageIO->SetIORegion(streamIORegion);
339 this->GenerateData();
341 this->UpdateProgress((
float) (piece+1) / numDivisions );
349 this->ReleaseInputs();
355 template <
class TInputImage>
364 itkDebugMacro(<<
"Writing file: " << m_FileName);
367 const void* dataPtr = (
const void*) input->GetBufferPointer();
373 Convert(m_ImageIO->GetIORegion(), ioRegion, largestRegion.GetIndex());
377 if (bufferedRegion != ioRegion)
379 if ( m_NumberOfStreamDivisions > 1 || m_UserSpecifiedIORegion)
381 itkDebugMacro(
"Requested stream region does not match generated output");
382 itkDebugMacro(
"input filter may not support streaming well");
384 cacheImage = InputImageType::New();
385 cacheImage->CopyInformation(input);
386 cacheImage->SetBufferedRegion(ioRegion);
387 cacheImage->Allocate();
392 ConstIteratorType in(input, ioRegion);
393 IteratorType out(cacheImage, ioRegion);
396 for (in.GoToBegin(), out.GoToBegin(); !in.IsAtEnd(); ++in, ++out)
401 dataPtr = (
const void*) cacheImage->GetBufferPointer();
408 msg <<
"Did not get requested region!" << std::endl;
409 msg <<
"Requested:" << std::endl;
411 msg <<
"Actual:" << std::endl;
412 msg << bufferedRegion;
420 m_ImageIO->Write(dataPtr);
425 template <
class TInputImage>
430 Superclass::PrintSelf(os,indent);
432 os << indent <<
"File Name: "
433 << (m_FileName.data() ? m_FileName.data() :
"(none)") << std::endl;
435 os << indent <<
"Image IO: ";
436 if ( m_ImageIO.IsNull() )
442 os << m_ImageIO <<
"\n";
445 os << indent <<
"IO Region: " << m_PasteIORegion <<
"\n";
446 os << indent <<
"Number of Stream Divisions: " << m_NumberOfStreamDivisions <<
"\n";
448 if (m_UseCompression)
450 os << indent <<
"Compression: On\n";
454 os << indent <<
"Compression: Off\n";
457 if (m_UseInputMetaDataDictionary)
459 os << indent <<
"UseInputMetaDataDictionary: On\n";
463 os << indent <<
"UseInputMetaDataDictionary: Off\n";
466 if (m_FactorySpecifiedImageIO)
468 os << indent <<
"FactorySpecifiedmageIO: On\n";
472 os << indent <<
"FactorySpecifiedmageIO: Off\n";