From 81ed6935092ed908ca5c1af450f04c84baacf568 Mon Sep 17 00:00:00 2001 From: jpr Date: Tue, 14 Jan 2003 16:31:41 +0000 Subject: [PATCH] =?utf8?q?Ajout=20fonction=20int=20gdcmFile::WriteDcm=20(s?= =?utf8?q?tring=20nomFichier)=20ATTENTION=20:=20-->Elle=20ecrit=20*forceme?= =?utf8?q?nt*=20en=20IMPLICIT=20little=20Endian=20(si=20on=20a=20un=20proc?= =?utf8?q?esseur=20intel=20...)=20-->Elle=20part=20d'un=20gdcmFile=20*forc?= =?utf8?q?ement*=20correct=20(aucun=20test=20de=20vraisemblance=20n'est=20?= =?utf8?q?fait)=20-->Rien=20n'est=20encore=20pr=E9vu=20pour=20'fabriquer'?= =?utf8?q?=20un=20gdcmHeader=20ex-nihilo?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/gdcm.h | 5 ++--- src/gdcmElValSet.cxx | 40 ++++++++++++++++++++++++++++++++-------- src/gdcmFile.cxx | 12 +++++------- src/gdcmHeader.cxx | 19 ++++++------------- 4 files changed, 45 insertions(+), 31 deletions(-) diff --git a/src/gdcm.h b/src/gdcm.h index 457920c4..1b387098 100644 --- a/src/gdcm.h +++ b/src/gdcm.h @@ -165,10 +165,10 @@ public: int ReplaceEntry(gdcmDictEntry* NewEntry); int RemoveEntry (TagKey k); int RemoveEntry (guint16 group, guint16 element); - // renvoie une ligne de Dictionnaire Dicom à partir de (numGroup, numElement) gdcmDictEntry * GetTag(guint32 group, guint32 element); + void Print(ostream&); TagHT & GetEntries(void) { return entries; } }; @@ -264,7 +264,6 @@ public: string GetName(void) { return entry->GetName(); }; string GetVR(void) { return entry->GetVR(); }; - void SetVR(string v) { entry->SetVR(v); }; // Question : @@ -359,7 +358,7 @@ private: FILE * fp; // The tag Image Location (0028,0200) - containing the address of // the pixels - is not allways present. Then we store this information - + // il etait facultatif en ACR-NEMA, il n'existe plus en DICOM 3 // FIXME // Question : diff --git a/src/gdcmElValSet.cxx b/src/gdcmElValSet.cxx index 6cdcc310..54200c68 100644 --- a/src/gdcmElValSet.cxx +++ b/src/gdcmElValSet.cxx @@ -8,7 +8,7 @@ TagElValueHT & ElValSet::GetTagHt(void) { } void ElValSet::Add(ElValue * newElValue) { - tagHt[newElValue->GetKey()] = newElValue; + tagHt [newElValue->GetKey()] = newElValue; NameHt[newElValue->GetName()] = newElValue; } @@ -30,7 +30,13 @@ int ElValSet::Write(FILE * _fp) { guint16 gr, el; guint32 lgr; + const char * val; + string vr; + guint32 val_int32; + guint16 val_int16; + void *ptr; + // A FAIRE : // parcourir la table pour recalculer la longueur des 'elements 0x0000' @@ -43,11 +49,13 @@ int ElValSet::Write(FILE * _fp) { for (TagElValueHT::iterator tag = tagHt.begin(); tag != tagHt.end(); ++tag){ - + + / ... } */ // resteront à tester les echecs en écriture + for (TagElValueHT::iterator tag = tagHt.begin(); tag != tagHt.end(); ++tag){ @@ -56,25 +64,41 @@ int ElValSet::Write(FILE * _fp) { // peut-on se passer des affectations? // - passer l'adresse du resultat d'une fonction (???) // - acceder au champ sans passer par un accesseur ? + gr = tag->second->GetGroup(); el = tag->second->GetElement(); lgr = tag->second->GetLength(); val = tag->second->GetValue().c_str(); - + vr = tag->second->GetVR(); + fwrite ( &gr,(size_t)2 ,(size_t)1 ,_fp); //group fwrite ( &el,(size_t)2 ,(size_t)1 ,_fp); //element - //fwrite ( tag->second->GetVR(),(size_t)2 ,(size_t)1 ,_fp); //VR + //fwrite ( vr,(size_t)2 ,(size_t)1 ,_fp); //VR // voir pb lgr + VR + // On fait de l'implicit VR (penser a forcer le SYNTAX TRANSFERT UID) fwrite ( &lgr,(size_t)4 ,(size_t)1 ,_fp); //lgr - - // ATTENTION - // voir pb des int16 et int32 : les identifier, les convertir, modifier la longueur - // ou alors stocker la valeur 16 ou 32 bits, + un indicateur : char, int16, int32 + if (vr == "US" || vr == "SS") { + val_int16 = atoi(val); + ptr = &val_int16; + fwrite ( ptr,(size_t)2 ,(size_t)1 ,_fp); + continue; + } + if (vr == "UL" || vr == "SL") { + val_int32 = atoi(val); + ptr = &val_int32; + fwrite ( ptr,(size_t)4 ,(size_t)1 ,_fp); + continue; + } + + // Les pixels ne sont pas chargés dans l'element ! + if ((gr == 0x7fe0) && (el == 0x0010) ) break; + fwrite ( val,(size_t)lgr ,(size_t)1 ,_fp); //valeur Elem } + return(1); } diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index 89c872f3..8337ce87 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -2,8 +2,6 @@ #include "gdcm.h" -#define DEBUG 1 - static void _Swap(void* im, int swap, int lgr, int nb); ///////////////////////////////////////////////////////////////// @@ -159,10 +157,7 @@ void * gdcmFile::GetImageData (void) { *deb = (*deb >> (nbu-highBit-1)) & mask; deb ++; } - } - - printf ("on est sorti\n"); - + } // On l'affecte à un champ du dcmFile Pixels = _Pixels; @@ -413,11 +408,14 @@ int gdcmFile::WriteDcm (string nomFichier) { filePreamble=(char*)calloc(128,1); fwrite(filePreamble,128,1,fp1); fwrite("DICM",4,1,fp1); - if(DEBUG) printf("Ecriture File Preamble\n"); // un accesseur de + est obligatoire ??? + // pourtant le ElValSet contenu dans le gdcmHeader + // ne devrait pas être visible par l'utilisateur final (?) GetPubElVals().Write(fp1); + + fwrite(Pixels, lgrTotale, 1, fp1); fclose (fp1); return(1); diff --git a/src/gdcmHeader.cxx b/src/gdcmHeader.cxx index 5a16e591..361aedd8 100644 --- a/src/gdcmHeader.cxx +++ b/src/gdcmHeader.cxx @@ -13,9 +13,8 @@ #include #include "gdcmUtil.h" -#define HEADER_LENGTH_TO_READ 256 // on ne lit plus que le debut - -#define DEBUG 1 +#define HEADER_LENGTH_TO_READ 256 // on ne lit plus que le debut +#define _MaxSizeLoadElementValue_ 1024 // longueur au dela de laquelle on ne charge plus les valeurs namespace Error { struct FileReadError { @@ -49,7 +48,7 @@ void gdcmHeader::Initialise(void) { } gdcmHeader::gdcmHeader (const char* InFilename) { - SetMaxSizeLoadElementValue(1024); + SetMaxSizeLoadElementValue(_MaxSizeLoadElementValue_); filename = InFilename; Initialise(); fp=fopen(InFilename,"rw"); @@ -248,7 +247,6 @@ void gdcmHeader::SwitchSwapToBigEndian(void) { void gdcmHeader::GetPixels(size_t lgrTotale, void* _Pixels) { size_t pixelsOffset; pixelsOffset = GetPixelOffset(); - printf("pixelsOffset %d\n",pixelsOffset); fseek(fp, pixelsOffset, SEEK_SET); fread(_Pixels, 1, lgrTotale, fp); } @@ -500,8 +498,8 @@ bool gdcmHeader::IsJPEGSpectralSelectionProcess6_8TransferSyntax(void) { // Il y en a encore DIX-SEPT, comme ça. // Il faudrait trouver qq chose + rusé ... // - - +// --> probablement TOUS les supprimer (Eric dixit) +// void gdcmHeader::FixFoundLength(ElValue * ElVal, guint32 FoundLength) { // Heuristic: a final fix. if ( FoundLength == 0xffffffff) @@ -731,7 +729,7 @@ void gdcmHeader::LoadElementValue(ElValue * ElVal) { // The group length doesn't represent data to be loaded in memory, since // each element of the group shall be loaded individualy. if( elem == 0 ) - SkipLoad = true; + //SkipLoad = true; // modif sauvage JPR if ( SkipLoad ) { // FIXME the following skip is not necessary @@ -1158,15 +1156,10 @@ void gdcmHeader::ParseHeader(void) { */ void gdcmHeader::LoadElements(void) { - if (DEBUG) printf("LoadElements : Entree\n"); - rewind(fp); - if (DEBUG) printf("LoadElements : rewind\n"); TagElValueHT ht = PubElVals.GetTagHt(); - if (DEBUG) printf("LoadElements : GetTagHt\n"); - for (TagElValueHT::iterator tag = ht.begin(); tag != ht.end(); ++tag) { LoadElementValue(tag->second); } -- 2.48.1