Program: gdcm
Module: $RCSfile: gdcmFile.cxx,v $
Language: C++
- Date: $Date: 2005/07/07 10:12:32 $
- Version: $Revision: 1.248 $
+ Date: $Date: 2005/08/29 13:05:01 $
+ Version: $Revision: 1.265 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
// as the Z coordinate,
// 0. for all the coordinates if nothing is found
//
+// Image Position (Patient) (0020,0032) VM=3 What is it used for?
+// -->
+// The attribute Patient Orientation (0020,0020) from the General Image Module
+// is of type 2C and has the condition Required if image does not require
+// Image Orientation (0020,0037) and Image Position (0020,0032).
+// However, if the image does require the attributes
+// - Image Orientation (Patient) (0020,0037), VM=6
+// - Image Position Patient (0020,0032), VM=3
+// then attribute Patient Orientation (0020,0020) should not be present
+// in the images.
+//
+// Remember also :
+// Patient Position (0018,5100) values : HFP = Head First-Prone
+// HFS = Head First-Supine
+// HFDR = Head First-Decubitus Right
+// HFDL = Head First-Decubitus Left
+// FFDR = Feet First-Decubitus Right
+// FFDL = Feet First-Decubitus Left
+// FFP = Feet First-Prone
+// FFS = Feet First-Supine
+// can also find SEMIERECT
+// SUPINE
+// CS 2 Patient Orientation (0020 0020)
+// When the coordinates of the image
+// are always present, this field is almost never used.
+// Better we don't tust it too much ...
+// Found Values are : L\P
+// L\FP
+// P\F
+// L\F
+// P\FR
+// R\F
+//
+// (0020|0037) [Image Orientation (Patient)] [1\0\0\0\1\0 ]
+
+
// ---------------------------------------------------------------
//
#include "gdcmFile.h"
namespace gdcm
{
+
//-----------------------------------------------------------------------------
// Constructor / Destructor
NumPixel = 0x0010;
}
-/**
- * \brief Constructor
- * @param filename name of the file whose header we want to analyze
- */
-File::File( std::string const &filename )
- :Document( )
-{
- RLEInfo = new RLEFramesInfo;
- JPEGInfo = new JPEGFragmentsInfo;
-
- Load( filename ); // gdcm::Document is first Loaded, then the 'File part'
-}
/**
* \brief Canonical destructor.
//-----------------------------------------------------------------------------
// 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 )
+bool File::Load( )
{
- if ( ! this->Document::Load( fileName ) )
+ if ( ! this->Document::Load( ) )
return false;
+ return DoTheLoadingJob( );
+}
+
+/**
+ * \brief Does the Loading Job (internal use only)
+ * @return false if file cannot be open or no swap info was found,
+ * or no tag was found.
+ */
+bool File::DoTheLoadingJob( )
+{
+
// 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
* @param iop adress of the (6)float array to receive values
* @return cosines of image orientation patient
*/
-void File::GetImageOrientationPatient( float iop[6] )
+bool File::GetImageOrientationPatient( float iop[6] )
{
std::string strImOriPat;
//iop is supposed to be float[6]
&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." );
+ return false;
}
}
//For ACR-NEMA
&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." );
+ return false;
}
}
+ return true;
}
/**
/**
* \brief Retrieve the number of Bits Allocated
- * (8, 12 -compacted ACR-NEMA files-, 16, ...)
- * @return The encountered number of Bits Allocated, 0 by default.
+ * (8, 12 -compacted ACR-NEMA files-, 16, 24 -old RGB ACR-NEMA files-,)
+ * @return The encountered Number of Bits Allocated, 0 by default.
* 0 means the file is NOT USABLE. The caller has to check it !
*/
int File::GetBitsAllocated()
}
else if ( bitsAlloc == "24" )
{
- // (in order no to be messed up
- bitsAlloc = "8"; // by old RGB images)
+ // (in order no to be messed up by old RGB images)
+ bitsAlloc = "8";
}
std::string sign = GetEntryValue(0x0028, 0x0103);//"Pixel Representation"
el.Group = group;
el.Elem = elem;
el.Value = value;
- AnonymizeList.push_back(el);
+ UserAnonymizeList.push_back(el);
}
/**
uint32_t lgth;
uint32_t valLgth = 0;
std::string *spaces;
- for (ListElements::iterator it = AnonymizeList.begin();
- it != AnonymizeList.end();
+ for (ListElements::iterator it = UserAnonymizeList.begin();
+ it != UserAnonymizeList.end();
++it)
{
d = GetDocEntry( (*it).Group, (*it).Elem);
if ( d == NULL)
continue;
- if ( dynamic_cast<BinEntry *>(d)
- || dynamic_cast<SeqEntry *>(d) )
+ if ( dynamic_cast<SeqEntry *>(d) )
+ {
+ gdcmWarningMacro( "You cannot 'Anonymize' a SeqEntry ");
continue;
+ }
offset = d->GetOffset();
lgth = d->GetLength();
/**
* \brief anonymize a File (remove Patient's personal info passed with
* AddAnonymizeElement()
+ * \note You cannot Anonymize a BinEntry (to be fixed)
*/
bool File::AnonymizeFile()
{
// If Anonymisation list is empty, let's perform some basic anonymization
- if ( AnonymizeList.begin() == AnonymizeList.end() )
+ if ( UserAnonymizeList.begin() == UserAnonymizeList.end() )
{
// If exist, replace by spaces
SetValEntry (" ",0x0010, 0x2154); // Telephone
}
else
{
- SetValEntry("anonymised", 0x0010, 0x0010);
+ SetValEntry("anonymized", 0x0010, 0x0010);
}
}
}
else
{
gdcm::DocEntry *d;
- for (ListElements::iterator it = AnonymizeList.begin();
- it != AnonymizeList.end();
+ for (ListElements::iterator it = UserAnonymizeList.begin();
+ it != UserAnonymizeList.end();
++it)
{
d = GetDocEntry( (*it).Group, (*it).Elem);
if ( d == NULL)
continue;
- if ( dynamic_cast<BinEntry *>(d)
- || dynamic_cast<SeqEntry *>(d) )
+ if ( dynamic_cast<SeqEntry *>(d) )
+ {
+ gdcmWarningMacro( "You cannot 'Anonymize' a SeqEntry ");
continue;
+ }
- SetValEntry ((*it).Value, (*it).Group, (*it).Elem);
+ if ( dynamic_cast<BinEntry *>(d) )
+ {
+ gdcmWarningMacro( "To 'Anonymize' a BinEntry, better use AnonymizeNoLoad (FIXME) ");
+ continue;
+ }
+ else
+ SetValEntry ((*it).Value, (*it).Group, (*it).Elem);
}
}
}
}
+// These are the deprecated method that one day should be removed (after the next release)
+
+#ifndef GDCM_LEGACY_REMOVE
+/**
+ * \brief Constructor (DEPRECATED : temporaryly kept not to break the API)
+ * @param filename name of the file whose header we want to analyze
+ * @deprecated do not use any longer
+ */
+File::File( std::string const &filename )
+ :Document( )
+{
+ RLEInfo = new RLEFramesInfo;
+ JPEGInfo = new JPEGFragmentsInfo;
+
+ SetFileName( filename );
+ Load( ); // gdcm::Document is first Loaded, then the 'File part'
+}
+
+/**
+ * \brief Loader. (DEPRECATED : temporaryly kept not to break the API)
+ * @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.
+ * @deprecated Use the Load() [ + SetLoadMode() ] + SetFileName() functions instead
+ */
+bool File::Load( std::string const &fileName )
+{
+ GDCM_LEGACY_REPLACED_BODY(File::Load(std::string), "1.2",
+ File::Load());
+ SetFileName( fileName );
+ if ( ! this->Document::Load( ) )
+ return false;
+
+ return DoTheLoadingJob( );
+}
+#endif
+
//-----------------------------------------------------------------------------
// Print