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
{
RLEInfo = new RLEFramesInfo;
JPEGInfo = new JPEGFragmentsInfo;
- GrPixel = 0x7fe0;
+ GrPixel = 0x7fe0; // to avoid further troubles
NumPixel = 0x0010;
}
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
{
// 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();
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"
}
}
}
+ 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
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;
}
/**
* \brief gets the info from 0028,0030 : Pixel Spacing
+ * (first in 0018,1164 : ImagerPixelSpacing)
* else 1.0
* @return X dimension of a pixel
*/
{
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 )
return 1.;
}
- int nbValues;
if( ( nbValues = sscanf( strSpacing.c_str(),
"%f \\%f ", &yspacing, &xspacing)) != 2 )
{
/**
* \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)");
}
// 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 )