X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FclitkGateAsciiImageIO.cxx;h=589c30cfb783b0a9d0ae7d43a1a3609e1a7d8a8b;hb=fe401a1eebf96ce5a94c424d53d7c58486f4bf55;hp=f3d4a8d49211670def30995457eb484651210c4e;hpb=8d8e16a85eb4b10e69c9d987fa997191aa0fbceb;p=clitk.git diff --git a/common/clitkGateAsciiImageIO.cxx b/common/clitkGateAsciiImageIO.cxx index f3d4a8d..589c30c 100644 --- a/common/clitkGateAsciiImageIO.cxx +++ b/common/clitkGateAsciiImageIO.cxx @@ -17,7 +17,6 @@ ===========================================================================**/ // std include -#include #include #include #include @@ -33,246 +32,238 @@ using std::endl; std::ostream& operator<<(std::ostream& os, const clitk::GateAsciiImageIO::GateAsciiHeader& header) { - os << "matrix_size=[" << header.matrix_size[0] << "," << header.matrix_size[1] << "," << header.matrix_size[2] << "]" << endl; - os << "resolution=[" << header.resolution[0] << "," << header.resolution[1] << "," << header.resolution[2] << "]" << endl; - os << "voxel_size=[" << header.voxel_size[0] << "," << header.voxel_size[1] << "," << header.voxel_size[2] << "]" << endl; - os << "nb_value=" << header.nb_value << endl; - return os; + os << "matrix_size=[" << header.matrix_size[0] << "," << header.matrix_size[1] << "," << header.matrix_size[2] << "]" << endl; + os << "resolution=[" << header.resolution[0] << "," << header.resolution[1] << "," << header.resolution[2] << "]" << endl; + os << "voxel_size=[" << header.voxel_size[0] << "," << header.voxel_size[1] << "," << header.voxel_size[2] << "]" << endl; + os << "nb_value=" << header.nb_value << endl; + return os; } //-------------------------------------------------------------------- // Read Image Information void clitk::GateAsciiImageIO::ReadImageInformation() { - FILE* handle = fopen(m_FileName.c_str(),"r"); - if (!handle) { - itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName); - return; - } - - GateAsciiHeader header; - if (!ReadHeader(handle,header)) { - itkGenericExceptionMacro(<< "Could not read header: " << m_FileName); - fclose(handle); - return; - } + FILE* handle = fopen(m_FileName.c_str(),"r"); + if (!handle) { + itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName); + return; + } + + GateAsciiHeader header; + if (!ReadHeader(handle,header)) { + itkGenericExceptionMacro(<< "Could not read header: " << m_FileName); fclose(handle); - - int real_length = -1; - double real_spacing = 0; - for (int kk=0; kk<3; kk++) { - if (header.resolution[kk]>1) { - if (real_length>0) { - itkGenericExceptionMacro(<< "Could not image dimension: " << m_FileName); - return; - } - real_length = header.resolution[kk]; - real_spacing = header.voxel_size[kk]; - } + return; + } + fclose(handle); + + int real_length = -1; + double real_spacing = 0; + for (int kk=0; kk<3; kk++) { + if (header.resolution[kk]>1) { + if (real_length>0) { + itkGenericExceptionMacro(<< "Could not image dimension: " << m_FileName); + return; + } + real_length = header.resolution[kk]; + real_spacing = header.voxel_size[kk]; } - assert(real_length == header.nb_value); - - // Set image information - SetNumberOfDimensions(2); - SetDimensions(0, real_length); - SetDimensions(1, 1); - SetSpacing(0, real_spacing); - SetSpacing(1, 1); - SetOrigin(0, 0); - SetOrigin(1, 0); - SetComponentType(itk::ImageIOBase::DOUBLE); + } + assert(real_length == header.nb_value); + + // Set image information + SetNumberOfDimensions(2); + SetDimensions(0, real_length); + SetDimensions(1, 1); + SetSpacing(0, real_spacing); + SetSpacing(1, 1); + SetOrigin(0, 0); + SetOrigin(1, 0); + SetComponentType(itk::ImageIOBase::DOUBLE); } //-------------------------------------------------------------------- bool clitk::GateAsciiImageIO::CanReadFile(const char* FileNameToRead) { - std::string filename(FileNameToRead); + std::string filename(FileNameToRead); - { // check extension - std::string filenameext = GetExtension(filename); - if (filenameext != "txt") return false; - } + { + // check extension + std::string filenameext = GetExtension(filename); + if (filenameext != "txt") return false; + } - { // check header - FILE* handle = fopen(filename.c_str(),"r"); - if (!handle) return false; + { + // check header + FILE* handle = fopen(filename.c_str(),"r"); + if (!handle) return false; - GateAsciiHeader header; - if (!ReadHeader(handle,header)) { fclose(handle); return false; } - fclose(handle); + GateAsciiHeader header; + if (!ReadHeader(handle,header)) { + fclose(handle); + return false; } + fclose(handle); + } - return true; + return true; } //-------------------------------------------------------------------- // Read Line in file bool clitk::GateAsciiImageIO::ReadLine(FILE* handle, std::string& line) { - std::stringstream stream; - while (true) - { - char item; - if (ferror(handle)) return false; - if (fread(&item,1,1,handle) != 1) return false; - - if (item=='\n' or feof(handle)) { - line = stream.str(); - return true; - } - - stream << item; + std::stringstream stream; + while (true) { + char item; + if (ferror(handle)) return false; + if (fread(&item,1,1,handle) != 1) return false; + + if (item=='\n' || feof(handle)) { + line = stream.str(); + return true; } -} -std::string ExtractMatch(const std::string& base, const regmatch_t& match) -{ - return base.substr(match.rm_so,match.rm_eo-match.rm_so); + stream << item; + } } template T ConvertFromString(const std::string& value) { - std::stringstream stream; - stream << value; - T converted; - stream >> converted; - return converted; + std::stringstream stream; + stream << value; + T converted; + stream >> converted; + return converted; +} + +bool +clitk::GateAsciiImageIO::FindRegularExpressionNextLine(itksys::RegularExpression ®, std::string &s, FILE* handle) +{ + std::string line; + if(!ReadLine(handle,line)) return false; + if(!reg.compile(s.c_str())) return false; + return reg.find(line.c_str()); } //-------------------------------------------------------------------- // Read Image Header bool clitk::GateAsciiImageIO::ReadHeader(FILE* handle, GateAsciiHeader& header) { - assert(handle); - std::string line; - - regex_t re_comment; - regex_t re_matrix_size; - regex_t re_resol; - regex_t re_voxel_size; - regex_t re_nb_value; - regmatch_t matches[4]; - - { // build regex - int ret = 0; - ret = regcomp(&re_comment,"^#.+$",REG_EXTENDED|REG_NEWLINE); - assert(ret == 0); - ret = regcomp(&re_matrix_size,"^# +Matrix *Size *= +\\(([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*)\\)$",REG_EXTENDED|REG_NEWLINE); - assert(ret == 0); - ret = regcomp(&re_resol,"^# +Resol *= +\\(([0-9]+),([0-9]+),([0-9]+)\\)$",REG_EXTENDED|REG_NEWLINE); - assert(ret == 0); - ret = regcomp(&re_voxel_size,"^# +Voxel *Size *= +\\(([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*)\\)$",REG_EXTENDED|REG_NEWLINE); - assert(ret == 0); - ret = regcomp(&re_nb_value,"^# +nbVal *= +([0-9]+)$",REG_EXTENDED|REG_NEWLINE); - assert(ret == 0); - } + assert(handle); + + std::string regexstr[6] = { + "^#.+$", + "^# +Matrix *Size *= +\\(([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*)\\)$", + "^# +Resol *= +\\(([0-9]+),([0-9]+),([0-9]+)\\)$", + "^# +Voxel *Size *= +\\(([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*),([0-9]+\\.?[0-9]*)\\)$", + "^# +nbVal *= +([0-9]+)$" + }; - if (!ReadLine(handle,line)) return false; - if (regexec(&re_comment,line.c_str(),1,matches,0) == REG_NOMATCH) return false; + itksys::RegularExpression regex; - if (!ReadLine(handle,line)) return false; - if (regexec(&re_matrix_size,line.c_str(),4,matches,0) == REG_NOMATCH) return false; - header.matrix_size[0] = ConvertFromString(ExtractMatch(line,matches[1])); - header.matrix_size[1] = ConvertFromString(ExtractMatch(line,matches[2])); - header.matrix_size[2] = ConvertFromString(ExtractMatch(line,matches[3])); + if(!FindRegularExpressionNextLine(regex, regexstr[0], handle)) return false; - if (!ReadLine(handle,line)) return false; - if (regexec(&re_resol,line.c_str(),4,matches,0) == REG_NOMATCH) return false; - header.resolution[0] = ConvertFromString(ExtractMatch(line,matches[1])); - header.resolution[1] = ConvertFromString(ExtractMatch(line,matches[2])); - header.resolution[2] = ConvertFromString(ExtractMatch(line,matches[3])); + if(!FindRegularExpressionNextLine(regex, regexstr[1], handle)) return false; + header.matrix_size[0] = ConvertFromString(regex.match(1)); + header.matrix_size[1] = ConvertFromString(regex.match(2)); + header.matrix_size[2] = ConvertFromString(regex.match(3)); - if (!ReadLine(handle,line)) return false; - if (regexec(&re_voxel_size,line.c_str(),4,matches,0) == REG_NOMATCH) return false; - header.voxel_size[0] = ConvertFromString(ExtractMatch(line,matches[1])); - header.voxel_size[1] = ConvertFromString(ExtractMatch(line,matches[2])); - header.voxel_size[2] = ConvertFromString(ExtractMatch(line,matches[3])); + if(!FindRegularExpressionNextLine(regex, regexstr[2], handle)) return false; + header.resolution[0] = ConvertFromString(regex.match(1)); + header.resolution[1] = ConvertFromString(regex.match(2)); + header.resolution[2] = ConvertFromString(regex.match(3)); - if (!ReadLine(handle,line)) return false; - if (regexec(&re_nb_value,line.c_str(),2,matches,0) == REG_NOMATCH) return false; - header.nb_value = ConvertFromString(ExtractMatch(line,matches[1])); + if(!FindRegularExpressionNextLine(regex, regexstr[3], handle)) return false; + header.voxel_size[0] = ConvertFromString(regex.match(1)); + header.voxel_size[1] = ConvertFromString(regex.match(2)); + header.voxel_size[2] = ConvertFromString(regex.match(3)); - if (!ReadLine(handle,line)) return false; - if (regexec(&re_comment,line.c_str(),1,matches,0) == REG_NOMATCH) return false; + if(!FindRegularExpressionNextLine(regex, regexstr[4], handle)) return false; + header.nb_value = ConvertFromString(regex.match(1)); - return true; + if(!FindRegularExpressionNextLine(regex, regexstr[0], handle)) return false; + + return true; } //-------------------------------------------------------------------- // Read Image Content void clitk::GateAsciiImageIO::Read(void* abstract_buffer) { - FILE* handle = fopen(m_FileName.c_str(),"r"); - if (!handle) { - itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName); - return; - } - - GateAsciiHeader header; - if (!ReadHeader(handle,header)) { - itkGenericExceptionMacro(<< "Could not read header: " << m_FileName); - fclose(handle); - return; - } - - { - double* buffer = static_cast(abstract_buffer); - int read_count = 0; - while (true) { - std::string line; - if (!ReadLine(handle,line)) break; - *buffer = ConvertFromString(line); - read_count++; - buffer++; - } - assert(read_count == header.nb_value); + FILE* handle = fopen(m_FileName.c_str(),"r"); + if (!handle) { + itkGenericExceptionMacro(<< "Could not open file (for reading): " << m_FileName); + return; + } + + GateAsciiHeader header; + if (!ReadHeader(handle,header)) { + itkGenericExceptionMacro(<< "Could not read header: " << m_FileName); + fclose(handle); + return; + } + + { + double* buffer = static_cast(abstract_buffer); + int read_count = 0; + while (true) { + std::string line; + if (!ReadLine(handle,line)) break; + *buffer = ConvertFromString(line); + read_count++; + buffer++; } + assert(read_count == header.nb_value); + } - fclose(handle); + fclose(handle); } //-------------------------------------------------------------------- bool clitk::GateAsciiImageIO::CanWriteFile(const char* FileNameToWrite) { - if (GetExtension(std::string(FileNameToWrite)) != "txt") return false; - return true; + if (GetExtension(std::string(FileNameToWrite)) != "txt") return false; + return true; } void clitk::GateAsciiImageIO::WriteImageInformation() { - cout << GetNumberOfDimensions() << endl; + cout << GetNumberOfDimensions() << endl; } bool clitk::GateAsciiImageIO::SupportsDimension(unsigned long dim) { - if (dim==2) return true; - return false; + if (dim==2) return true; + return false; } //-------------------------------------------------------------------- // Write Image void clitk::GateAsciiImageIO::Write(const void* abstract_buffer) { - const unsigned long nb_value = GetDimensions(0)*GetDimensions(1); - std::stringstream stream; - stream << "######################" << endl; - stream << "# Matrix Size= (" << GetSpacing(0)*GetDimensions(0) << "," << GetSpacing(1)*GetDimensions(1) << ",1)" << endl; - stream << "# Resol = (" << GetDimensions(0) << "," << GetDimensions(1) << ",1)" << endl; - stream << "# VoxelSize = (" << GetSpacing(0) << "," << GetSpacing(1) << ",1)" << endl; - stream << "# nbVal = " << nb_value << endl; - stream << "######################" << endl; - - const double* buffer = static_cast(abstract_buffer); - for (unsigned long kk=0; kk(abstract_buffer); + for (unsigned long kk=0; kk