X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmFile.cxx;h=a1c975f42ade566949abe80bf1a2f53aad203ff0;hb=a4a4d786fdefad3af77842f41b12dcb85b7b1142;hp=49305ccf0f721ba8890ef9d6dd3cf176317f7a6e;hpb=2ffeaa9f4fd8aca8296266f15a6db6919d53a7e3;p=gdcm.git diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index 49305ccf..a1c975f4 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFile.cxx,v $ Language: C++ - Date: $Date: 2005/05/11 18:32:17 $ - Version: $Revision: 1.237 $ + Date: $Date: 2005/06/10 14:05:37 $ + Version: $Revision: 1.242 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -55,7 +55,7 @@ File::File(): { RLEInfo = new RLEFramesInfo; JPEGInfo = new JPEGFragmentsInfo; - GrPixel = 0x7fe0; + GrPixel = 0x7fe0; // to avoid further troubles NumPixel = 0x0010; } @@ -69,6 +69,33 @@ File::File( std::string const &filename ) RLEInfo = new RLEFramesInfo; JPEGInfo = new JPEGFragmentsInfo; + Load( filename ); +} + +/** + * \brief Canonical destructor. + */ +File::~File () +{ + if( RLEInfo ) + delete RLEInfo; + if( JPEGInfo ) + delete JPEGInfo; +} + +//----------------------------------------------------------------------------- +// Public + +/** + * \brief Loader + * @param fileName file to be open for parsing + * @return false if file cannot be open or no swap info was found, + * or no tag was found. + */ +bool File::Load( std::string const &fileName ) +{ + this->Document::Load( fileName ); + // for some ACR-NEMA images GrPixel, NumPixel is *not* 7fe0,0010 // We may encounter the 'RETired' (0x0028, 0x0200) tag // (Image Location") . This entry contains the number of @@ -117,7 +144,7 @@ File::File( std::string const &filename ) { // Compute the RLE or JPEG info OpenFile(); - std::string ts = GetTransferSyntax(); + const std::string &ts = GetTransferSyntax(); Fp->seekg( entry->GetOffset(), std::ios::beg ); if ( Global::GetTS()->IsRLELossless(ts) ) ComputeRLEInfo(); @@ -125,7 +152,7 @@ File::File( std::string const &filename ) ComputeJPEGFragmentInfo(); CloseFile(); - // Create a new BinEntry to change the the DictEntry + // Create a new BinEntry to change the DictEntry // The changed DictEntry will have // - a correct PixelVR OB or OW) // - the name to "Pixel Data" @@ -156,24 +183,8 @@ File::File( std::string const &filename ) } } } + return true; } - - -/** - * \brief Canonical destructor. - */ -File::~File () -{ - if( RLEInfo ) - delete RLEInfo; - if( JPEGInfo ) - delete JPEGInfo; -} - -//----------------------------------------------------------------------------- -// Public - - /** * \brief This predicate, based on hopefully reasonable heuristics, * decides whether or not the current File was properly parsed @@ -192,25 +203,35 @@ bool File::IsReadable() const std::string &res = GetEntryValue(0x0028, 0x0005); if ( res != GDCM_UNFOUND && atoi(res.c_str()) > 4 ) { + gdcmWarningMacro("Wrong Image Dimensions" << res); return false; // Image Dimensions } if ( !GetDocEntry(0x0028, 0x0100) ) { + gdcmWarningMacro("Bits Allocated (0028|0100) not found"); return false; // "Bits Allocated" } if ( !GetDocEntry(0x0028, 0x0101) ) { + gdcmWarningMacro("Bits Stored (0028|0101) not found"); return false; // "Bits Stored" } if ( !GetDocEntry(0x0028, 0x0102) ) { + gdcmWarningMacro("Hight Bit (0028|0102) not found"); return false; // "High Bit" } if ( !GetDocEntry(0x0028, 0x0103) ) { + gdcmWarningMacro("Pixel Representation (0028|0103) not found"); return false; // "Pixel Representation" i.e. 'Sign' } - + if ( !GetDocEntry(GrPixel, NumPixel) ) + { + gdcmWarningMacro("Pixel Dicom Element " << std::hex << + GrPixel << "|" << NumPixel << "not found"); + return false; // Pixel Dicom Element not found :-( + } return true; } @@ -364,6 +385,7 @@ int File::GetZSize() /** * \brief gets the info from 0028,0030 : Pixel Spacing + * (first in 0018,1164 : ImagerPixelSpacing) * else 1.0 * @return X dimension of a pixel */ @@ -371,6 +393,32 @@ float File::GetXSpacing() { float xspacing = 1.0; float yspacing = 1.0; + int nbValues; + + // To follow David Clunie's advice, we first check ImagerPixelSpacing + // (never saw any image with that field :-( + + const std::string &strImagerPixelSpacing = GetEntryValue(0x0018,0x1164); + if( strImagerPixelSpacing != GDCM_UNFOUND ) + { + if( ( nbValues = sscanf( strImagerPixelSpacing.c_str(), + "%f\\%f", &yspacing, &xspacing)) != 2 ) + { + // if no values, xspacing is set to 1.0 + if( nbValues == 0 ) + xspacing = 1.0; + // if single value is found, xspacing is defaulted to yspacing + if( nbValues == 1 ) + xspacing = yspacing; + + if ( xspacing == 0.0 ) + xspacing = 1.0; + + return xspacing; + } + } + + const std::string &strSpacing = GetEntryValue(0x0028,0x0030); if( strSpacing == GDCM_UNFOUND ) @@ -379,7 +427,6 @@ float File::GetXSpacing() return 1.; } - int nbValues; if( ( nbValues = sscanf( strSpacing.c_str(), "%f \\%f ", &yspacing, &xspacing)) != 2 ) { @@ -414,14 +461,33 @@ float File::GetXSpacing() /** * \brief gets the info from 0028,0030 : Pixel Spacing + * (first in 0018,1164 : ImagerPixelSpacing) * else 1.0 * @return Y dimension of a pixel */ float File::GetYSpacing() { float yspacing = 1.; - std::string strSpacing = GetEntryValue(0x0028,0x0030); - + int nbValues; + // To follow David Clunie's advice, we first check ImagerPixelSpacing + // (never saw any image with that field :-( + + const std::string &strImagerPixelSpacing = GetEntryValue(0x0018,0x1164); + if( strImagerPixelSpacing != GDCM_UNFOUND ) + { + nbValues = sscanf( strImagerPixelSpacing.c_str(), "%f", &yspacing); + + // if sscanf cannot read any float value, it won't affect yspacing + if( nbValues == 0 ) + yspacing = 1.0; + + if ( yspacing == 0.0 ) + yspacing = 1.0; + + return yspacing; + } + + std::string strSpacing = GetEntryValue(0x0028,0x0030); if ( strSpacing == GDCM_UNFOUND ) { gdcmWarningMacro("Unfound Pixel Spacing (0028,0030)"); @@ -429,7 +495,7 @@ float File::GetYSpacing() } // if sscanf cannot read any float value, it won't affect yspacing - int nbValues = sscanf( strSpacing.c_str(), "%f ", &yspacing); + nbValues = sscanf( strSpacing.c_str(), "%f", &yspacing); // if no values, yspacing is set to 1.0 if( nbValues == 0 )