22 #include <itksys/SystemTools.hxx>
58 virtual unsigned char ReadByte() = 0;
65 itksys_ios::ostringstream oss;
124 itksys_ios::ostringstream oss;
125 oss <<
"Error reading byte from file at position: " << ::gztell(
m_GzFile);
130 return static_cast<unsigned char>(byte);
142 unsigned int numberOfBytesToRead = Math::CastWithRangeCheck< unsigned int, SizeType >( bytes );
146 itksys_ios::ostringstream oss;
147 oss <<
"File size does not match header: "
148 << bytes <<
" bytes requested but only "
149 << bread <<
" bytes available!" << std::endl
150 <<
"At file position " << ::gztell(
m_GzFile);
166 unsigned int numberOfBytesToWrite = Math::CastWithRangeCheck< unsigned int, SizeType >( bytes );
167 SizeType bwritten = ::gzwrite(
m_GzFile, const_cast<void *>(data), numberOfBytesToWrite);
168 if( bwritten != bytes )
172 std::cout <<
"Could not write all bytes to file" << std::endl;
191 m_File = fopen(file, mode);
213 itksys_ios::ostringstream oss;
214 oss <<
"Error reading byte from file at position: " << ::ftell(
m_File);
219 return static_cast<unsigned char>(byte);
231 const size_t numberOfBytesToRead = Math::CastWithRangeCheck< size_t, SizeType >( bytes );
232 SizeType bread = fread(data, NumericTraits<size_t>::One, numberOfBytesToRead,
m_File);
235 itksys_ios::ostringstream oss;
236 oss <<
"File size does not match header: "
237 << bytes <<
" bytes requested but only "
238 << bread <<
" bytes available!" << std::endl
239 <<
"At file position " << ftell(
m_File);
255 const size_t numberOfBytesToWrite = Math::CastWithRangeCheck< size_t, SizeType >( bytes );
256 SizeType bwritten = fwrite(data, NumericTraits<size_t>::One, numberOfBytesToWrite,
m_File);
257 if( bwritten != bytes )
277 template<
typename TPixel>
290 (TPixel*)buffer, numberOfBytes /
sizeof(TPixel) );
295 (TPixel *)buffer, numberOfBytes /
sizeof(TPixel) );
403 itkDebugMacro(<<
"The file is not a valid CUB file");
489 while(issHeader.good())
492 char linebuffer[512];
493 issHeader.getline(linebuffer, 512);
496 std::istringstream iss(linebuffer);
502 const std::string::size_type keysize = key.size();
504 if( ( keysize > 0 ) && (key[key.size() - 1] ==
':' ))
507 key = key.substr(0, key.size() - 1);
513 iss >> m_Dimensions[1];
514 iss >> m_Dimensions[2];
527 iss >> ox; iss >> oy; iss >> oz;
586 EncapsulateMetaData<OrientationFlags>(
595 itksys_ios::ostringstream oss;
605 EncapsulateMetaData<std::string>(dic, key, oss.str());
623 if(GetNumberOfDimensions() != 3)
631 itksys_ios::ostringstream header;
634 header << m_VB_IDENTIFIER_SYSTEM << std::endl;
635 header << m_VB_IDENTIFIER_FILETYPE << std::endl;
638 switch(m_ComponentType)
642 header << m_VB_DATATYPE <<
":\t" << m_VB_DATATYPE_BYTE << std::endl;
646 header << m_VB_DATATYPE <<
":\t" << m_VB_DATATYPE_INT << std::endl;
649 header << m_VB_DATATYPE <<
":\t" << m_VB_DATATYPE_FLOAT << std::endl;
652 header << m_VB_DATATYPE <<
":\t" << m_VB_DATATYPE_DOUBLE << std::endl;
661 header << m_VB_DIMENSIONS <<
":\t"
662 << m_Dimensions[0] <<
"\t"
663 << m_Dimensions[1] <<
"\t"
664 << m_Dimensions[2] << std::endl;
667 header << m_VB_SPACING <<
":\t"
668 << m_Spacing[0] <<
"\t"
669 << m_Spacing[1] <<
"\t"
670 << m_Spacing[2] << std::endl;
674 double x= -m_Origin[0] / m_Spacing[0];
675 double y= -m_Origin[1] / m_Spacing[1];
676 double z= -m_Origin[2] / m_Spacing[2];
677 header << m_VB_ORIGIN <<
":\t"
678 << ((x>=0)?(
int) (x+.5):(int) (x-.5)) <<
"\t"
679 << ((y>=0)?(int) (y+.5):(int) (y-.5)) <<
"\t"
680 << ((z>=0)?(int) (z+.5):(int) (z-.5)) << std::endl;
691 InverseOrientationMap::const_iterator it =
692 m_InverseOrientationMap.find(oflag);
693 if(it != m_InverseOrientationMap.end())
695 header << m_VB_ORIENTATION <<
":\t" << it->second << std::endl;
701 std::vector<std::string> keys= dic.
GetKeys();
703 for(
size_t i=0; i<keys.size(); i++)
709 const std::string &key = keys[i];
710 ExposeMetaData<std::string>(dic, key, word);
711 if (!strcmp(key.c_str(),
"resample_date"))
715 word=ctime(&rawtime);
716 header<<key<<
":\t"<<word;
720 header<<key<<
":\t"<<word<<std::endl;
728 m_Writer->WriteData(header.str().c_str(), header.str().size());
736 m_Writer = CreateWriter(m_FileName.c_str());
737 WriteImageInformation();
738 m_Writer->WriteData(buffer, this->GetImageSizeInBytes());
747 os << indent <<
"PixelType " <<
m_PixelType <<
"\n";
753 std::string fname = filename;
756 itkDebugMacro(<<
"No filename specified.");
760 bool extensionFound =
false;
761 isCompressed =
false;
763 std::string::size_type giplPos = fname.rfind(
".cub");
764 if ((giplPos != std::string::npos)
765 && (giplPos == fname.length() - 4))
767 extensionFound =
true;
770 giplPos = fname.rfind(
".cub.gz");
771 if ((giplPos != std::string::npos)
772 && (giplPos == fname.length() - 7))
774 extensionFound =
true;
778 return extensionFound;
834 OrientationMap::const_iterator it;
835 for(it = m_OrientationMap.begin(); it != m_OrientationMap.end(); ++it)
836 m_InverseOrientationMap[it->second] = it->first;
844 if(m_ComponentType == CHAR)
847 buffer, numberOfBytes, m_ByteOrder);
849 else if(m_ComponentType == UCHAR)
852 buffer, numberOfBytes, m_ByteOrder);
854 else if(m_ComponentType == SHORT)
857 buffer, numberOfBytes, m_ByteOrder);
859 else if(m_ComponentType == USHORT)
862 buffer, numberOfBytes, m_ByteOrder);
864 else if(m_ComponentType == INT)
867 buffer, numberOfBytes, m_ByteOrder);
869 else if(m_ComponentType == UINT)
872 buffer, numberOfBytes, m_ByteOrder);
874 else if(m_ComponentType == LONG)
877 buffer, numberOfBytes, m_ByteOrder);
879 else if(m_ComponentType == ULONG)
882 buffer, numberOfBytes, m_ByteOrder);
884 else if(m_ComponentType == FLOAT)
887 buffer, numberOfBytes, m_ByteOrder);
889 else if(m_ComponentType == DOUBLE)
892 buffer, numberOfBytes, m_ByteOrder);