]> Creatis software - gdcm.git/blobdiff - src/gdcmFile.cxx
BUG: Replace 0 with SEEK_SET, this was wrong for djgpp
[gdcm.git] / src / gdcmFile.cxx
index 61c2652e31592ddfbb59e5c57f632ee77f8b1dec..a43e5b7afb2d6f5b037515082c6f8a4bae35e432 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmFile.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/05/11 14:40:57 $
-  Version:   $Revision: 1.236 $
+  Date:      $Date: 2005/05/17 12:44:09 $
+  Version:   $Revision: 1.238 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -364,6 +364,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 +372,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,9 +406,8 @@ float File::GetXSpacing()
       return 1.;
    }
 
-   int nbValues;
    if( ( nbValues = sscanf( strSpacing.c_str(), 
-         "%f\\%f", &yspacing, &xspacing)) != 2 )
+         "%f \\%f ", &yspacing, &xspacing)) != 2 )
    {
       // if no values, xspacing is set to 1.0
       if( nbValues == 0 )
@@ -405,7 +431,7 @@ float File::GetXSpacing()
    {
       gdcmWarningMacro("gdcmData/CT-MONO2-8-abdo.dcm-like problem");
       // seems to be a bug in the header ...
-      nbValues = sscanf( strSpacing.c_str(), "%f\\0\\%f", &yspacing, &xspacing);
+      nbValues = sscanf( strSpacing.c_str(), "%f \\0\\%f ", &yspacing, &xspacing);
       gdcmAssertMacro( nbValues == 2 );
    }
 
@@ -414,14 +440,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 +474,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 )
@@ -505,7 +550,7 @@ float File::GetXOrigin()
       }
    }
 
-   if( sscanf( strImPos.c_str(), "%f\\%f\\%f", &xImPos, &yImPos, &zImPos) != 3 )
+   if( sscanf( strImPos.c_str(), "%f \\%f \\%f ", &xImPos, &yImPos, &zImPos) != 3 )
    {
       return 0.;
    }
@@ -535,7 +580,7 @@ float File::GetYOrigin()
       }  
    }
 
-   if( sscanf( strImPos.c_str(), "%f\\%f\\%f", &xImPos, &yImPos, &zImPos) != 3 )
+   if( sscanf( strImPos.c_str(), "%f \\%f \\%f ", &xImPos, &yImPos, &zImPos) != 3 )
    {
       return 0.;
    }
@@ -558,7 +603,7 @@ float File::GetZOrigin()
 
    if ( strImPos != GDCM_UNFOUND )
    {
-      if( sscanf( strImPos.c_str(), "%f\\%f\\%f", &xImPos, &yImPos, &zImPos) != 3)
+      if( sscanf( strImPos.c_str(), "%f \\%f \\%f ", &xImPos, &yImPos, &zImPos) != 3)
       {
          gdcmWarningMacro( "Wrong Image Position Patient (0020,0032)");
          return 0.;  // bug in the element 0x0020,0x0032
@@ -573,7 +618,7 @@ float File::GetZOrigin()
    if ( strImPos != GDCM_UNFOUND )
    {
       if( sscanf( strImPos.c_str(), 
-          "%f\\%f\\%f", &xImPos, &yImPos, &zImPos ) != 3 )
+          "%f \\%f \\%f ", &xImPos, &yImPos, &zImPos ) != 3 )
       {
          gdcmWarningMacro( "Wrong Image Position (RET) (0020,0030)");
          return 0.;  // bug in the element 0x0020,0x0032
@@ -587,7 +632,7 @@ float File::GetZOrigin()
    std::string strSliceLocation = GetEntryValue(0x0020,0x1041); // for *very* old ACR-NEMA images
    if ( strSliceLocation != GDCM_UNFOUND )
    {
-      if( sscanf( strSliceLocation.c_str(), "%f", &zImPos) != 1)
+      if( sscanf( strSliceLocation.c_str(), "%f ", &zImPos) != 1)
       {
          gdcmWarningMacro( "Wrong Slice Location (0020,1041)");
          return 0.;  // bug in the element 0x0020,0x1041
@@ -602,7 +647,7 @@ float File::GetZOrigin()
    std::string strLocation = GetEntryValue(0x0020,0x0050);
    if ( strLocation != GDCM_UNFOUND )
    {
-      if( sscanf( strLocation.c_str(), "%f", &zImPos) != 1)
+      if( sscanf( strLocation.c_str(), "%f ", &zImPos) != 1)
       {
          gdcmWarningMacro( "Wrong Location (0020,0050)");
          return 0.;  // bug in the element 0x0020,0x0050
@@ -632,7 +677,7 @@ void File::GetImageOrientationPatient( float iop[6] )
    // 0020 0037 DS REL Image Orientation (Patient)
    if ( (strImOriPat = GetEntryValue(0x0020,0x0037)) != GDCM_UNFOUND )
    {
-      if( sscanf( strImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f", 
+      if( sscanf( strImOriPat.c_str(), "%f \\ %f \\%f \\%f \\%f \\%f ", 
           &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6 )
       {
          gdcmWarningMacro( "Wrong Image Orientation Patient (0020,0037). Less than 6 values were found." );
@@ -642,7 +687,7 @@ void File::GetImageOrientationPatient( float iop[6] )
    // 0020 0035 DS REL Image Orientation (RET)
    else if ( (strImOriPat = GetEntryValue(0x0020,0x0035)) != GDCM_UNFOUND )
    {
-      if( sscanf( strImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f", 
+      if( sscanf( strImOriPat.c_str(), "%f \\ %f \\%f \\%f \\%f \\%f ", 
           &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6 )
       {
          gdcmWarningMacro( "wrong Image Orientation Patient (0020,0035). Less than 6 values were found." );
@@ -677,7 +722,7 @@ int File::GetBitsStored()
 int File::GetBitsAllocated()
 {
    std::string strSize = GetEntryValue(0x0028,0x0100);
-   if ( strSize == GDCM_UNFOUND )
+   if ( strSize == GDCM_UNFOUND  )
    {
       gdcmWarningMacro( "(0028,0100) is supposed to be mandatory");
       return 0; // It's supposed to be mandatory
@@ -1016,7 +1061,7 @@ float File::GetRescaleIntercept()
    const std::string &strRescInter = GetEntryValue(0x0028,0x1052);
    if ( strRescInter != GDCM_UNFOUND )
    {
-      if( sscanf( strRescInter.c_str(), "%f", &resInter) != 1 )
+      if( sscanf( strRescInter.c_str(), "%f ", &resInter) != 1 )
       {
          // bug in the element 0x0028,0x1052
          gdcmWarningMacro( "Rescale Intercept (0028,1052) is empty." );
@@ -1037,7 +1082,7 @@ float File::GetRescaleSlope()
    std::string strRescSlope = GetEntryValue(0x0028,0x1053);
    if ( strRescSlope != GDCM_UNFOUND )
    {
-      if( sscanf( strRescSlope.c_str(), "%f", &resSlope) != 1)
+      if( sscanf( strRescSlope.c_str(), "%f ", &resSlope) != 1)
       {
          // bug in the element 0x0028,0x1053
          gdcmWarningMacro( "Rescale Slope (0028,1053) is empty.");