Program: gdcm
Module: $RCSfile: gdcmFile.cxx,v $
Language: C++
- Date: $Date: 2005/04/14 14:26:19 $
- Version: $Revision: 1.232 $
+ 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
/**
* \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 )
+ "%f \\%f ", &yspacing, &xspacing)) != 2 )
{
// if no values, xspacing is set to 1.0
if( nbValues == 0 )
{
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 );
}
/**
* \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, xspacing is set to 1.0
+ // if no values, yspacing is set to 1.0
if( nbValues == 0 )
yspacing = 1.0;
}
}
- 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.;
}
}
}
- 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.;
}
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
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
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
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
// 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." );
// 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." );
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
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." );
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.");
e0000->SetValue(sLen.str());
}
- // Bits Allocated
- if ( GetEntryValue(0x0028,0x0100) == "12")
- {
- SetValEntry("16", 0x0028,0x0100);
- }
-
int i_lgPix = GetEntryLength(GrPixel, NumPixel);
if (i_lgPix != -2)
{
InsertValEntry(s_lgPix,GrPixel, 0x0000);
}
- // FIXME : should be nice if we could move it to File
- // (or in future gdcmPixelData class)
-
- // Drop Palette Color, if necessary
- if ( GetEntryValue(0x0028,0x0002).c_str()[0] == '3' )
- {
- // if SamplesPerPixel = 3, sure we don't need any LUT !
- // Drop 0028|1101, 0028|1102, 0028|1103
- // Drop 0028|1201, 0028|1202, 0028|1203
-
- DocEntry *e = GetDocEntry(0x0028,0x01101);
- if (e)
- {
- RemoveEntryNoDestroy(e);
- }
- e = GetDocEntry(0x0028,0x1102);
- if (e)
- {
- RemoveEntryNoDestroy(e);
- }
- e = GetDocEntry(0x0028,0x1103);
- if (e)
- {
- RemoveEntryNoDestroy(e);
- }
- e = GetDocEntry(0x0028,0x01201);
- if (e)
- {
- RemoveEntryNoDestroy(e);
- }
- e = GetDocEntry(0x0028,0x1202);
- if (e)
- {
- RemoveEntryNoDestroy(e);
- }
- e = GetDocEntry(0x0028,0x1203);
- if (e)
- {
- RemoveEntryNoDestroy(e);
- }
- }
-
Document::WriteContent(fp, writetype);
fp->close();
// - when more than one frame are present, then we are in
// the case of a multi-frame image.
long frameLength;
- while ( (frameLength = ReadTagLength(0xfffe, 0xe000)) )
+ while ( (frameLength = ReadTagLength(0xfffe, 0xe000)) != 0 )
{
// Parse the RLE Header and store the corresponding RLE Segment
// Offset Table information on fragments of this current Frame.
// Loop on the fragments[s] and store the parsed information in a
// JPEGInfo.
long fragmentLength;
- while ( (fragmentLength = ReadTagLength(0xfffe, 0xe000)) )
+ while ( (fragmentLength = ReadTagLength(0xfffe, 0xe000)) != 0 )
{
long fragmentOffset = Fp->tellg();