20 #include <itksys/SystemTools.hxx>
40 itkDebugMacro( <<
"StreamingReadBufferAsBinary called" );
42 char *buffer =
static_cast<char*
>(_buffer);
44 std::streampos dataPos = this->GetDataPosition();
46 std::streamsize sizeOfRegion =
static_cast<std::streamsize
>( m_IORegion.GetNumberOfPixels() )
47 *this->GetPixelSize();
51 std::streamsize sizeOfChunk = 1;
52 unsigned int movingDirection = 0;
55 sizeOfChunk *= m_IORegion.GetSize(movingDirection);
58 while ( movingDirection < m_IORegion.GetImageDimension() &&
59 m_IORegion.GetSize(movingDirection-1) == this->GetDimensions(movingDirection-1) );
60 sizeOfChunk *= this->GetPixelSize();
63 std::streamsize gcount = 0;
64 while ( m_IORegion.IsInside(currentIndex) )
67 std::streampos seekPos = 0;
68 size_t subDimensionQuantity = 1;
69 for (
unsigned int i = 0; i < m_IORegion.GetImageDimension(); ++i )
71 seekPos = seekPos +
static_cast<std::streamoff
> (subDimensionQuantity *
72 this->GetPixelSize() *
74 subDimensionQuantity *= this->GetDimensions(i);
78 itkDebugMacro(<<
"Reading " << sizeOfChunk <<
" of " << sizeOfRegion <<
" bytes for " << m_FileName <<
" at " << dataPos+seekPos <<
" position in file");
80 file.seekg( dataPos+seekPos, std::ios::beg );
81 this->ReadBufferAsBinary( file, buffer, sizeOfChunk );
84 buffer += sizeOfChunk;
85 gcount += file.gcount();
89 itkExceptionMacro(<<
"Fail reading");
92 if (movingDirection == m_IORegion.GetImageDimension())
96 ++currentIndex[movingDirection];
97 for (
unsigned int i = movingDirection; i < m_IORegion.GetImageDimension()-1; ++i)
101 if (static_cast<ImageIORegion::SizeValueType>(currentIndex[i] - m_IORegion.GetIndex(i)) >= m_IORegion.GetSize(i) )
103 currentIndex[i] = m_IORegion.GetIndex(i);
109 if ( gcount != sizeOfRegion )
111 itkExceptionMacro(
"Data not read completely. Expected = " << sizeOfRegion <<
", but only read " << gcount <<
" bytes.");
121 const SizeType maxChunk = 1024*1024*1024;
123 std::streamsize bytesRemaining =
static_cast<std::streamsize
>( num );
125 while (bytesRemaining)
128 std::streamsize bytesToRead = bytesRemaining > maxChunk ? maxChunk : bytesRemaining;
130 itkDebugMacro(<<
"Reading " << bytesToRead <<
" of " << bytesRemaining <<
" bytes for " <<
m_FileName);
132 is.read( static_cast<char *>( buffer ) , bytesToRead );
134 if ( (is.gcount() != bytesToRead) || is.fail() )
138 buffer =
static_cast<char *
>( buffer ) + bytesToRead;
139 bytesRemaining -= bytesToRead;
149 const SizeType maxChunk = 1024*1024*1024;
151 std::streamsize bytesRemaining = num;
152 while (bytesRemaining)
155 SizeType bytesToWrite = bytesRemaining > maxChunk ? maxChunk : bytesRemaining;
157 itkDebugMacro(<<
"Writing " << bytesToWrite <<
" of " << bytesRemaining <<
" bytes for " <<
m_FileName);
159 os.write(static_cast<const char*>(buffer) , bytesToWrite);
165 buffer =
static_cast<const char *
>( buffer ) + bytesToWrite;
166 bytesRemaining -= bytesToWrite;
175 itkDebugMacro( <<
"StreamingWriteBufferAsBinary called" );
177 const char *buffer =
static_cast< const char*
>( _buffer );
182 std::streamsize sizeOfChunk = 1;
183 unsigned int movingDirection = 0;
198 std::streampos seekPos = 0;
199 size_t subDimensionQuantity = 1;
202 seekPos = seekPos +
static_cast<std::streamoff
> (subDimensionQuantity *
208 file.seekp( dataPos+seekPos, std::ios::beg );
212 buffer += sizeOfChunk;
215 itkDebugMacro(<<
"Writing " << sizeOfChunk <<
" of " <<
" ?? bytes for " <<
m_FileName <<
" at " << dataPos+seekPos <<
" position in file");
220 itkExceptionMacro(<<
"Fail writing");
227 ++currentIndex[movingDirection];
232 if ( static_cast<ImageIORegion::SizeValueType>(currentIndex[i] -
m_IORegion.
GetIndex(i))
249 if ( *filename == 0 )
251 itkExceptionMacro(<<
"A FileName must be specified.");
261 itkDebugMacro(<<
"Initialize: opening file " << filename);
263 os.open(filename, std::ios::in | std::ios::binary );
266 itkExceptionMacro(<<
"Could not open file for reading: " << filename);
274 if ( *filename == 0 )
276 itkExceptionMacro(<<
"A FileName must be specified.");
286 itkDebugMacro(<<
"Initialize: opening file " << filename);
291 os.open(
m_FileName.c_str(), std::ios::out | std::ios::binary | std::ios::trunc );
296 os.open(
m_FileName.c_str(), std::ios::out | std::ios::binary | std::ios::in );
301 itkExceptionMacro(<<
"Could not open file for writing: " << filename);
322 if (!itksys::SystemTools::FileExists(
m_FileName.c_str() ))
326 else if (pasteRegion != largestPossibleRegion)
331 std::string errorMessage;
336 headerImageIOReader->SetFileName(
m_FileName.c_str());
337 headerImageIOReader->ReadImageInformation();
341 errorMessage =
"Unable to read information from file: " +
m_FileName;
352 if (errorMessage.size())
366 errorMessage =
"Component type does not match in file: " +
m_FileName;
371 errorMessage =
"Dimensions does not match in file: " +
m_FileName;
378 if (headerImageIOReader->GetDimensions(i) != this->
GetDimensions(i) ||
379 headerImageIOReader->GetSpacing(i) != this->
GetSpacing(i) ||
380 headerImageIOReader->GetOrigin(i) != this->
GetOrigin(i))
382 errorMessage =
"Size, spacing or origin does not match in file: " +
m_FileName;
386 if (headerImageIOReader->GetDirection(i) != this->
GetDirection(i))
388 errorMessage =
"Direction cosines does not match in file: " +
m_FileName;
394 if (errorMessage.size())
396 itkExceptionMacro(
"Unable to paste because pasting file exists and is different. " << errorMessage);
398 else if ( headerImageIOReader->GetPixelType() != this->
GetPixelType() )
402 itkWarningMacro(
"Pixel types does not match file, but component type and number of components do.");
405 else if (numberOfRequestedSplits != 1)
411 if (!itksys::SystemTools::RemoveFile(
m_FileName.c_str()))
412 itkExceptionMacro(
"Unable to remove file for streaming: " <<
m_FileName);
436 streamableRegion = requestedRegion;
439 return streamableRegion;
454 for(
unsigned int i=0; i<maxNumberOfDimension; i++)
480 return (largestRegion != ioregion);