X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmHeader.cxx;h=7cb2cad0fad356999bfcf623eec6399ea0256169;hb=a2f6b3afa53313f320d92c0dad00b82b215cb156;hp=0a222f0facb99d3f884a92ae474a70c01da56c8c;hpb=02cfbaecc6c9fc4143576812d2b99b6de9616c91;p=gdcm.git diff --git a/src/gdcmHeader.cxx b/src/gdcmHeader.cxx index 0a222f0f..7cb2cad0 100644 --- a/src/gdcmHeader.cxx +++ b/src/gdcmHeader.cxx @@ -1,4 +1,4 @@ -// $Header: /cvs/public/gdcm/src/Attic/gdcmHeader.cxx,v 1.97 2003/10/09 14:58:28 malaterre Exp $ +// $Header: /cvs/public/gdcm/src/Attic/gdcmHeader.cxx,v 1.103 2003/10/23 12:08:32 jpr Exp $ #include "gdcmHeader.h" @@ -72,9 +72,26 @@ gdcmHeader::gdcmHeader(bool exception_on_error) { if(!fp) throw gdcmFileError("gdcmHeader::gdcmHeader(const char *, bool)"); } - if ( fp ) - return true; - dbg.Verbose(0, "gdcmHeader::gdcmHeader cannot open file", filename.c_str()); + + if ( fp ) { + guint16 zero; + fread(&zero, (size_t)2, (size_t)1, fp); + + //ACR -- or DICOM with no Preamble + if( zero == 0x0008 || zero == 0x0800 || zero == 0x0002 || zero == 0x0200) + return true; + //DICOM + fseek(fp, 126L, SEEK_CUR); + char dicm[4]; + fread(dicm, (size_t)4, (size_t)1, fp); + if( memcmp(dicm, "DICM", 4) == 0 ) + return true; + fclose(fp); + dbg.Verbose(0, "gdcmHeader::gdcmHeader not DICOM/ACR", filename.c_str()); + } + else { + dbg.Verbose(0, "gdcmHeader::gdcmHeader cannot open file", filename.c_str()); + } return false; } @@ -105,7 +122,7 @@ gdcmHeader::~gdcmHeader (void) { // Fourth semantics: // -// ---> Warning : This fourth fiels is NOT part +// ---> Warning : This fourth field is NOT part // of the 'official' Dicom Dictionnary // and should NOT be used. // (Not defined for all the groups @@ -612,14 +629,23 @@ bool gdcmHeader::IsDicomV3(void) { void gdcmHeader::FixFoundLength(gdcmElValue * ElVal, guint32 FoundLength) { if ( FoundLength == 0xffffffff) FoundLength = 0; + // Sorry for the patch! // XMedCom did the trick to read some nasty GE images ... - if (FoundLength == 13) + else if (FoundLength == 13) { // The following 'if' will be removed when there is no more - // images on Creatis HD with a 13 length for Manufacturer... - if ( (ElVal->GetGroup() != 0x0008) || (ElVal->GetElement() ) ) + // images on Creatis HDs with a 13 length for Manufacturer... + if ( (ElVal->GetGroup() != 0x0008) || (ElVal->GetElement() != 0x0070)) { // end of remove area FoundLength =10; + } + } + // to fix some garbage 'Leonardo' Siemens images + // May be commented out to avoid overhead + else if ( (ElVal->GetGroup() == 0x0009) + && + ( (ElVal->GetElement() == 0x1113) || (ElVal->GetElement() == 0x1114) ) ) + FoundLength =4; ElVal->SetLength(FoundLength); } @@ -641,23 +667,19 @@ void gdcmHeader::FixFoundLength(gdcmElValue * ElVal, guint32 FoundLength) { while ( ! FoundSequenceDelimiter) { g = ReadInt16(); - n = ReadInt16(); - - long l = ftell(fp); - + n = ReadInt16(); if (errno == 1) return 0; TotalLength += 4; // We even have to decount the group and element - if ( g != 0xfffe && g!=0xb00c ) /*for bogus header */ { + if ( g != 0xfffe && g!=0xb00c ) /*for bogus header */ { char msg[100]; // for sprintf. Sorry sprintf(msg,"wrong group (%04x) for an item sequence (%04x,%04x)\n",g, g,n); dbg.Verbose(1, "gdcmHeader::FindLengthOB: ",msg); - long l = ftell(fp); errno = 1; return 0; } - if ( n == 0xe0dd || ( g==0xb00c && n==0x0eb6 ) ) /* for bogus header */ + if ( n == 0xe0dd || ( g==0xb00c && n==0x0eb6 ) ) /* for bogus header */ FoundSequenceDelimiter = true; else if ( n != 0xe000 ){ char msg[100]; // for sprintf. Sorry @@ -669,8 +691,7 @@ void gdcmHeader::FixFoundLength(gdcmElValue * ElVal, guint32 FoundLength) { } ItemLength = ReadInt32(); TotalLength += ItemLength + 4; // We add 4 bytes since we just read - // the ItemLength with ReadInt32 - + // the ItemLength with ReadInt32 SkipBytes(ItemLength); } fseek(fp, PositionOnEntry, SEEK_SET); @@ -1138,6 +1159,7 @@ int gdcmHeader::ReplaceOrCreateByNumber(char* Value, guint16 Group, guint16 Elem /** * \ingroup gdcmHeader * \brief Set a new value if the invoked element exists + * Seems to be useless !!! * @param Value * @param Group * @param Elem @@ -1145,7 +1167,7 @@ int gdcmHeader::ReplaceOrCreateByNumber(char* Value, guint16 Group, guint16 Elem */ int gdcmHeader::ReplaceIfExistByNumber(char* Value, guint16 Group, guint16 Elem ) { - gdcmElValue* elValue = PubElValSet.GetElementByNumber(Group, Elem); + //gdcmElValue* elValue = PubElValSet.GetElementByNumber(Group, Elem); std::string v = Value; PubElValSet.SetElValueByNumber(v, Group, Elem); return 1; @@ -1225,9 +1247,8 @@ gdcmElValue * gdcmHeader::ReadNextElement(void) { * @return The result of the heuristical predicate. */ bool gdcmHeader::IsAnInteger(gdcmElValue * ElVal) { - guint16 group = ElVal->GetGroup(); guint16 element = ElVal->GetElement(); - std::string vr = ElVal->GetVR(); + std::string vr = ElVal->GetVR(); guint32 length = ElVal->GetLength(); // When we have some semantics on the element we just read, and if we @@ -1746,7 +1767,7 @@ void gdcmHeader::PrintPubElVal(std::ostream & os) { /** * \ingroup gdcmHeader - * \brief + * \brief * @return */ void gdcmHeader::PrintPubDict(std::ostream & os) { @@ -1756,7 +1777,7 @@ void gdcmHeader::PrintPubDict(std::ostream & os) { /** * \ingroup gdcmHeader * \brief - * @return + * @return integer, acts as a Boolean */ int gdcmHeader::Write(FILE * fp, FileType type) { @@ -1811,7 +1832,7 @@ void * gdcmHeader::LoadElementVoidArea(guint16 Group, guint16 Elem) { << std::hex << Group << " " << Elem << std::endl; return NULL; } - int res = PubElValSet.SetVoidAreaByNumber(a, Group, Elem); + /* int res = */ PubElValSet.SetVoidAreaByNumber(a, Group, Elem); // TODO check the result size_t l2 = fread(a, 1, l ,fp); if(l != l2) { @@ -1819,7 +1840,8 @@ void * gdcmHeader::LoadElementVoidArea(guint16 Group, guint16 Elem) { << std::hex << Group << " " << Elem << std::endl; free(a); return NULL; - } + } + return a; } /** @@ -1942,6 +1964,19 @@ int gdcmHeader::GetBitsStored(void) { return atoi(StrSize.c_str()); } +/** + * \ingroup gdcmHeader + * \brief Retrieve the number of Bits Allocated + * (8, 12 -compacted ACR-NEMA files, 16, ...) + * + * @return The encountered number of Bits Allocated, 0 by default. + */ +int gdcmHeader::GetBitsAllocated(void) { + std::string StrSize = GetPubElValByNumber(0x0028,0x0100); + if (StrSize == GDCM_UNFOUND) + return 1; + return atoi(StrSize.c_str()); +} /** * \ingroup gdcmHeader