Program: gdcm
Module: $RCSfile: gdcmFile.cxx,v $
Language: C++
- Date: $Date: 2007/07/03 08:17:24 $
- Version: $Revision: 1.333 $
+ Date: $Date: 2007/10/23 15:52:33 $
+ Version: $Revision: 1.341 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
* @return false if file cannot be open or no swap info was found,
* or no tag was found.
*/
-
bool File::Load( )
{
if ( ! this->Document::Load( ) )
}
else
{
-
GrPixel = (uint16_t) atoi( imgLocation.c_str() );
}
// Change only made if usefull
if ( PixelVR != oldEntry->GetVR() )
- {
+ {
//DictEntry* newDict = DictEntry::New(GrPixel,NumPixel,
// PixelVR,"1","Pixel Data");
//DataEntry *newEntry = DataEntry::New(newDict);
//RemoveEntry(oldEntry);
//AddEntry(newEntry);
//newEntry->Delete();
-
}
}
*/
TS *ts = Global::GetTS();
std::string sopclassuid_used;
// D 0002|0002 [UI] [Media Storage SOP Class UID]
-
+
//const std::string &mediastoragesopclassuid_str = GetEntryValue(0x0002,0x0002);
const std::string &mediastoragesopclassuid_str = GetEntryString(0x0002,0x0002);
const std::string &mediastoragesopclassuid = ts->GetValue(mediastoragesopclassuid_str);
}
return true;
}
-
return false;
}
-
+
/**
* \brief Retrieve the -unnormalized- number of 'times' of '4D image'.
* User has to tell gdcm the location of this '4th Dimension component'
DataEntry *entry = GetDataEntry(FourthDimensionLocation.GetGroup(),
FourthDimensionLocation.GetElement() );
- if( !entry )
+ if( !entry )
{
gdcmWarningMacro( " FourthDimensionLocation not found at : " <<
std::hex << FourthDimensionLocation.GetGroup()
{
return (int)entry->GetValue(0);
}
-}
-
-
+}
/**
* \brief gets the info from 0018,1164 : ImagerPixelSpacing
float File::GetXSpacing()
{
float xspacing = 1.0;
- float yspacing = 1.0;
+ float yspacing = 1.0;
float zspacing = 1.0;
-
+
uint32_t nbValue;
DataEntry *entry;
bool ok = false;
-
if ( GetSpacing(xspacing,yspacing,zspacing) )
{
return xspacing;
}
- // else fallback
-
+ // else fallback
+
/*
From:David Clunie - view profile
Date:Wed, May 24 2006 1:12 pm
if( nbValue !=2 )
gdcmWarningMacro("ImagerPixelSpacing (0x0018,0x1164) "
<< "has a wrong number of values :" << nbValue);
-
+
if( nbValue >= 3 )
xspacing = (float)entry->GetValue(2);
else if( nbValue >= 2 )
if( nbValue !=2 )
gdcmWarningMacro("PixelSpacing (0x0018,0x0030) "
<< "has a wrong number of values :" << nbValue);
-
+
if( nbValue >= 3 )
xspacing = (float)entry->GetValue(2);
else if( nbValue >= 2 )
uint32_t nbValue;
DataEntry *entry;
bool ok = false;
-
if ( GetSpacing(xspacing,yspacing,zspacing) )
{
return yspacing;
}
- // else fallback
-
-
+ // else fallback
+
std::string SOPClassUID = GetEntryString(0x0008,0x0016);
/// \todo check the various SOP Class
// (in order no to be messed up by old RGB images)
bitsAlloc = "8";
}
-
+
int i= atoi(bitsAlloc.c_str()); // fix a bug in some headers
if ( i > 8 && i < 16 )
{
bitsAlloc = "16";
}
-
+
std::string sign;
if( IsSignedPixelData() )
{
{
return true;
}
+
+ // MONOCHROME + [Enhanced CT Image Storage] actually have Palettes
+ std::string sopClassUid = GetEntryString( 0x0008, 0x0016 );
+ if (Util::DicomStringEqual( sopClassUid, "1.2.840.10008.5.1.4.1.1.2.1"))
+ {
+ return true;
+ }
if ( PhotometricInterp == GDCM_UNFOUND )
{
gdcmDebugMacro( "Not found : Palette color (0028,0004)");
*/
bool File::IsYBRFull()
{
- std::string PhotometricInterp = GetEntryString( 0x0028, 0x0004 );
+ std::string PhotometricInterp = GetEntryString( 0x0028, 0x0004 );
if ( PhotometricInterp == "YBR_FULL" )
{
return true;
return false;
}
// Red Palette Color Lookup Table Data
- if ( !GetDocEntry(0x0028,0x1201) )
+ bool segmented;
+ segmented = GetDocEntry(0x0028,0x1221) &&
+ GetDocEntry(0x0028,0x1222) &&
+ GetDocEntry(0x0028,0x1223);
+ if( segmented ) return true;
+
+ if( !GetDocEntry(0x0028,0x1201) )
{
return false;
}
}
return true;
}
-
return false;
}
/**
*\brief gets the info from 0028,1052 : Rescale Intercept
- * @return Rescale Intercept. defaulted to 0.0 is not found or empty
+ * @return Rescale Intercept. defaulted to 0.0 if not found or empty
*/
double File::GetRescaleIntercept()
{
/**
*\brief gets the info from 0028,1053 : Rescale Slope
- * @return Rescale Slope. defaulted to 1.0 is not found or empty
+ * @return Rescale Slope. defaulted to 1.0 if not found or empty
*/
double File::GetRescaleSlope()
{
gdcmWarningMacro( "You cannot 'Anonymize' a SeqEntry ");
continue;
}
-
+
valLgth = (*it).Value.size();
if (valLgth == 0)
continue;
*/
bool File::Write(std::string fileName, FileType writetype)
{
+ gdcmDebugMacro(" File::Write ");
std::ofstream *fp = new std::ofstream(fileName.c_str(),
std::ios::out | std::ios::binary);
if (*fp == NULL)
}
/// \todo FIXME : Derma?.dcm does not have it...let's remove it ?!? JPRx
- if( writetype != JPEG )
+ if( writetype != JPEG && writetype != JPEG2000)
{
int i_lgPix = GetEntryLength(GrPixel, NumPixel);
- if (i_lgPix != -2)
+ if (i_lgPix != -2) /// \todo wtf "-2" ?!?
{
// no (GrPixel, NumPixel) element
std::string s_lgPix = Util::Format("%d", i_lgPix+12);
s_lgPix = Util::DicomString( s_lgPix.c_str() );
- InsertEntryString(s_lgPix,GrPixel, 0x0000, "UL");
+ InsertEntryString(s_lgPix,GrPixel, 0x0000, "UL");
}
}
- Document::WriteContent(fp, writetype);
+ Document::WriteContent(fp, writetype,false,false);
fp->close();
delete fp;
// Private
/**
* \brief Parse pixel data from disk of [multi-]fragment RLE encoding.
- * Compute the RLE extra information and store it in \ref RLEInfo
+ * Compute the RLE extra information and store it in RLEInfo
* for later pixel retrieval usage.
*/
void File::ComputeRLEInfo()
/**
* \brief Parse pixel data from disk of [multi-]fragment Jpeg encoding.
* Compute the jpeg extra information (fragment[s] offset[s] and
- * length) and store it[them] in \ref JPEGInfo for later pixel
+ * length) and store it[them] in JPEGInfo for later pixel
* retrieval usage.
*/
void File::ComputeJPEGFragmentInfo()
}
/**
- * \brief Assuming the internal file pointer \ref Document::Fp
+ * \brief Assuming the internal file pointer Document::Fp
* is placed at the beginning of a tag, check whether this
* tag is (TestGroup, TestElem).
- * \warning On success the internal file pointer \ref Document::Fp
+ * \warning On success the internal file pointer Document::Fp
* is modified to point after the tag.
* On failure (i.e. when the tag wasn't the expected tag
* (TestGroup, TestElem) the internal file pointer
- * \ref Document::Fp is restored to its original position.
+ * Document::Fp is restored to its original position.
* @param testGroup The expected group of the tag.
* @param testElem The expected Element of the tag.
* @return True on success, false otherwise.
<< " but instead we encountered tag ("
<< DictEntry::TranslateToKey(itemTagGroup,itemTagElem) << ")"
<< " at address: " << " 0x(" << std::hex
- << (unsigned int)positionOnEntry << std::dec << ")"
+ << (unsigned int)positionOnEntry << std::dec << ")"
) ;
Fp->seekg(positionOnEntry, std::ios::beg);
}
/**
- * \brief Assuming the internal file pointer \ref Document::Fp
+ * \brief Assuming the internal file pointer Document::Fp
* is placed at the beginning of a tag (TestGroup, TestElement),
* read the length associated to the Tag.
- * \warning On success the internal file pointer \ref Document::Fp
+ * \warning On success the internal file pointer Document::Fp
* is modified to point after the tag and its length.
* On failure (i.e. when the tag wasn't the expected tag
* (TestGroup, TestElement) the internal file pointer
- * \ref Document::Fp is restored to its original position.
+ * Document::Fp is restored to its original position.
* @param testGroup The expected Group of the tag.
* @param testElem The expected Element of the tag.
* @return On success returns the length associated to the tag. On failure
}
//// Then read the associated Item Length
-
+
// long currentPosition = Fp->tellg(); // save time // JPRx
uint32_t itemLength = ReadInt32();
gdcmDebugMacro( "Basic Item Length is: " << itemLength