]> Creatis software - gdcm.git/blobdiff - src/gdcmFile.cxx
COMP: Snap, forgot this one...
[gdcm.git] / src / gdcmFile.cxx
index 49305ccf0f721ba8890ef9d6dd3cf176317f7a6e..3fc1414adf560767ec1e8ec77e98bc0a5c81d16f 100644 (file)
@@ -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/03 16:08:16 $
+  Version:   $Revision: 1.241 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -117,7 +117,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();
@@ -192,25 +192,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 +374,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 +382,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 +416,6 @@ float File::GetXSpacing()
       return 1.;
    }
 
-   int nbValues;
    if( ( nbValues = sscanf( strSpacing.c_str(), 
          "%f \\%f ", &yspacing, &xspacing)) != 2 )
    {
@@ -414,14 +450,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 +484,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 )