]> Creatis software - gdcm.git/commitdiff
Ajout fonction
authorjpr <jpr>
Tue, 14 Jan 2003 16:31:41 +0000 (16:31 +0000)
committerjpr <jpr>
Tue, 14 Jan 2003 16:31:41 +0000 (16:31 +0000)
int gdcmFile::WriteDcm (string nomFichier)
ATTENTION :
-->Elle ecrit *forcement* en IMPLICIT little Endian (si on a un processeur intel ...)
-->Elle part d'un gdcmFile *forcement* correct (aucun test de vraisemblance n'est fait)
-->Rien n'est encore prévu pour 'fabriquer' un gdcmHeader ex-nihilo

src/gdcm.h
src/gdcmElValSet.cxx
src/gdcmFile.cxx
src/gdcmHeader.cxx

index 457920c493cfc31dbf165da9e17278d4087a54e4..1b387098e06b74288cbe19773152e69dc3643c06 100644 (file)
@@ -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 :
index 6cdcc310cac9d592d7d9ac2e8afe76a85f526965..54200c68035070fa5afa5af45aa8b3b44013f4cc 100644 (file)
@@ -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);
 }
 
index 89c872f3cf81e0ae0608d02ffd9a972757a33114..8337ce87c5fbdd37f832d838eeca44885de13690 100644 (file)
@@ -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);
index 5a16e591114e3395a9bed2fcfe2623da52bbfd1a..361aedd878f997036677fccddfeca4cf6d8dc870 100644 (file)
@@ -13,9 +13,8 @@
 #include <sstream>
 #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);
                }