]> Creatis software - gdcm.git/commitdiff
ajout quelques fonctions gdcmFile
authorjpr <jpr>
Wed, 8 Jan 2003 16:07:45 +0000 (16:07 +0000)
committerjpr <jpr>
Wed, 8 Jan 2003 16:07:45 +0000 (16:07 +0000)
src/gdcm.h
src/gdcmFile.cxx
src/gdcmHeader.cxx

index 9c62d304a85b8a4f090f88e3572055828824845c..211afebe214a61ee4bbdd90c38012674de9626b3 100644 (file)
@@ -3,7 +3,7 @@
 // gdcmlib Intro:  
 // * gdcmlib is a library dedicated to reading and writing dicom files.
 // * LGPL for the license
-// * lightweigth as opposed to CTN or DCMTK wich come bundled which try
+// * lightweigth as opposed to CTN or DCMTK which come bundled which try
 //   to implement the full DICOM standard (networking...). gdcmlib concentrates
 //   on reading and writing
 // * Formats: this lib should be able to read ACR-NEMA v1 and v2, Dicom v3 (as
@@ -48,7 +48,7 @@ using namespace std;  // string type lives in the std namespace on VC++
                       // Quant au nombre d'entrees dans un DICOMDIR, c'est encore pire : il n'est limité
                       // que par la taille d'un CD-ROM (les DVD-ROM ne sont pas encore pris en compte)
                       // On peut s'attendre a 30 entrees par fichier dicom présent sur le CD-ROM
-                      // Remarque : il faudra se pencher sur le pb de la creation du DICOMDIR lorsqu'on voudra 
+                      // REMARQUE : il faudra se pencher sur le pb de la creation du DICOMDIR lorsqu'on voudra 
                       // exporter des images lisibles par les consoles cliniques 
                       // et pas seulement importables dans e-film. 
 
@@ -119,7 +119,6 @@ public:
        
        // fabrique une ligne de Dictionnaire Dicom à partir des parametres en entrée
 
-
        gdcmDictEntry(guint16 group, guint16 element,
                      string vr     = "Unknown",
                      string fourth = "Unknown",
@@ -144,8 +143,7 @@ public:
 // 
 //     c'est le Dictionnaire Dicom
 //
-
-  
 ////////////////////////////////////////////////////////////////////////////
 // A single DICOM dictionary i.e. a container for a collection of dictionary
 // entries. There should be a single public dictionary (THE dictionary of
@@ -165,6 +163,9 @@ public:
        // rempli le Dictionnaire Dicom à partir d'un fichier texte
        gdcmDict(const char* FileName);   // Read Dict from disk
        
+       // QUESTION :
+       // Ca doit ajouter une nouvelle entrée 'a la fin', ou 'a sa place' ?
+       //
        // TODO Swig int AppendEntry(gdcmDictEntry* NewEntry);
        
        // renvoie une ligne de Dictionnaire Dicom à partir de (numGroup, numElement)
@@ -231,7 +232,7 @@ public:
 //
 // Ne faudrait-il pas trouver un autre nom, qui preterait moins à confusion?
 // ElValue n'EST PAS la 'valeur d'un Element', mais la reunion d'infos
-// trouvees dans l'Entete" du fichier ET dans le Dictionnaire
+// trouvees dans l'Entete du fichier ET dans le Dictionnaire DICOM
 //
 
 // The dicom header of a Dicom file contains a set of such ELement VALUES
@@ -275,7 +276,7 @@ public:
 // ---------------------------------------------------- ElValSet
 //
 //     ... un ensemble d'Elements Dicom 
-//
+//     ... le résultat de l'analyse d'une entete d'image, par exemple
 
 ////////////////////////////////////////////////////////////////////////////
 // Container for a set of successfully parsed ElValues.
@@ -319,7 +320,7 @@ public:
 //   (Swig limitations for as Has_a dependency between gdcmFile and gdcmHeader)
  
 
-typedef string VRKey;
+typedef string VRKey;  // Ne devrait-elle pas etre utilisee dans la definition de VRHT ?
 typedef string VRAtr;
 typedef map<TagKey, VRAtr> VRHT;    // Value Representation Hash Table
                // Cette Table de Hachage ne devrait servir qu'a determiner
@@ -330,6 +331,13 @@ class GDCM_EXPORT gdcmHeader {
 private:
        static VRHT *dicom_vr;
        // Dictionaries of data elements:
+       
+       // Question :
+       // Pourquoi mettre un pointeur statique vers le container des dictionnaires
+       // (qui est une H-table de pointeurs vers des dictionnaires)
+       // en plus des pointeurs vers chacun des dictionnaires ?
+       // Ces derniers n'auraient-ils pas suffit ?
+       //
        static gdcmDictSet* Dicts;  // global dictionary container
        gdcmDict* RefPubDict;       // public dictionary
        gdcmDict* RefShaDict;       // shadow dictionary (optional)
@@ -340,7 +348,12 @@ private:
        FILE * fp;
        // The tag Image Location ((0028,0200) containing the address of
        // the pixels) is not allways present. Then we store this information
+       
        // FIXME
+       
+       // Question :
+       // Qu'y a-t-il a corriger ?
+       //
        // outside of the elements:
        guint16 grPixel;
        guint16 numPixel;
@@ -486,10 +499,20 @@ public:
 class GDCM_EXPORT gdcmFile: public gdcmHeader
 {
 private:
+       // QUESTION :
+       // Data pointe sur quoi?
+       // sur les Pixels lus?
+       // --> j'ajoute un champ public : Pixels
+       
        void* Data;
        int Parsed;          // weather allready parsed
        string OrigFileName; // To avoid file overwrite
 public:
+       // je ne suis pas sur d'avoir compris *où* il serait légitime de ranger ca.
+       // on pourra tjs le deplacer, et mettre des accesseurs
+       void * Pixels;
+       size_t lgrTotale;
+       
        // Constructor dedicated to writing a new DICOMV3 part10 compliant
        // file (see SetFileName, SetDcmTag and Write)
        // TODO Swig gdcmFile();
@@ -535,8 +558,11 @@ public:
        // incohérente avec l'ordre des octets en mémoire  
        // TODO Swig int Write();
        
-       // A FAIRE
-       // int WriteRawData (string nomFichier);
+       // Ecrit sur disque les pixels d'UNE image
+       // Aucun test n'est fait sur l'"Endiannerie" du processeur.
+       // C'est à l'utilisateur d'appeler son Reader correctement
+               
+       int WriteRawData (string nomFichier);
 };
 
 //
index af3f1fefed9617492feab70acec76c88d6ee5b1a..4791ca7f5c724da2cb6e17fc6976c69a78e2ba9a 100644 (file)
@@ -2,6 +2,8 @@
 
 #include "gdcm.h"
 
+#define DEBUG 1
+
 static void _Swap(void* im, int swap, int lgr, int nb);
 
 /////////////////////////////////////////////////////////////////
@@ -25,6 +27,7 @@ static void _Swap(void* im, int swap, int lgr, int nb);
 gdcmFile::gdcmFile(string & filename)
        :gdcmHeader(filename.c_str())
 {
+       if (DEBUG) printf("On a echappe a gdcmHeader !\n");
 }
 
 
@@ -85,7 +88,7 @@ size_t gdcmFile::GetImageDataSize(void) {
 
 void * gdcmFile::GetImageData (void) {
        
-       char* Pixels;
+       char* _Pixels;
        int nbLignes, nbCol;
 
        int nbFrames, nb, nbu, highBit, signe;
@@ -135,7 +138,7 @@ void * gdcmFile::GetImageData (void) {
                highBit = atoi(str_highBit.c_str() );
        }
                
-       // Signe des Pixels 
+       // Signe des Pixels 0 : Unsigned
        str_signe=GetPubElValByNumber(0x0028,0x0103);
 
        if (str_signe == "UNFOUND" ) {
@@ -145,18 +148,18 @@ void * gdcmFile::GetImageData (void) {
        }
        
        // Longueur en Octets des Pixels a lire
-       size_t lgrTotale = nbFrames*nbLignes*nbCol*(nb/8);
+       size_t _lgrTotale = nbFrames*nbLignes*nbCol*(nb/8);
        
-       //Pixels = (char *) g_malloc(lgrTotale);
-       Pixels = (char *) malloc(lgrTotale);
+       //Pixels = (char *) g_malloc(_lgrTotale);
+       _Pixels = (char *) malloc(_lgrTotale);
        
-       GetPixels(lgrTotale, Pixels);
+       GetPixels(lgrTotale, _Pixels);
 
        // On remet les Octets dans le bon ordre si besoin est
        if (nb != 8) {
                int _sw = GetSwapCode();
 
-               _Swap (Pixels, _sw, lgrTotale, nb);
+               _Swap (_Pixels, _sw, _lgrTotale, nb);
        }
        
        // On remet les Bits des Octets dans le bon ordre si besoin est
@@ -167,8 +170,8 @@ void * gdcmFile::GetImageData (void) {
        //                      --> ne marchera pas dans ce cas 
        if (nbu!=nb){
                mask = mask >> (nb-nbu);
-               int l=(int)lgrTotale/(nb/8);
-               unsigned short *deb = (unsigned short *)Pixels;
+               int l=(int)_lgrTotale/(nb/8);
+               unsigned short *deb = (unsigned short *)_Pixels;
                for(int i=0;i<l;i++) {
                                *deb = (*deb >> (nbu-highBit-1)) & mask;
                                deb ++;
@@ -177,9 +180,12 @@ void * gdcmFile::GetImageData (void) {
                
        printf ("on est sorti\n");
        
-       // VOIR s'il ne faudrait pas l'affecter à un champ du dcmHeader
+       // On l'affecte à un champ du dcmFile
+       
+       Pixels = _Pixels;
+       lgrTotale = _lgrTotale;
        
-       return (Pixels);                
+       return (_Pixels);               
 }
 
 
@@ -374,3 +380,31 @@ return;
 
 
 
+
+/////////////////////////////////////////////////////////////////
+/**
+ * \ingroup   gdcmFile
+ * \brief Ecrit sur disque les pixels d'UNE image
+ * \Aucun test n'est fait sur l'"Endiannerie" du processeur.
+ * \ C'est à l'utilisateur d'appeler son Reader correctement
+ * \(Equivalent a IdImaWriteRawFile) 
+ *
+ * @param 
+ *
+ * @return     
+ */
+
+int gdcmFile::WriteRawData (string nomFichier) {
+
+       FILE * fp1;
+       fp1 = fopen(nomFichier.c_str(),"wb");
+       if (fp1 == NULL) {
+               printf("Echec ouverture (ecriture) Fichier [%s] \n",nomFichier.c_str());
+               return (0);
+       } 
+       
+       fwrite (Pixels,lgrTotale, 1, fp1);
+       fclose (fp1);
+}
+       
+
index dd49a4593625189a8cc13dd27d70fca35f55f6a4..4f208912ce4dbd387418bfc6cb3c4f814d2b9cfd 100644 (file)
@@ -15,6 +15,8 @@
 
 #define HEADER_LENGTH_TO_READ 256 // on ne lit plus que le debut
 
+#define DEBUG 1
+
 namespace Error {
        struct FileReadError {
                FileReadError(FILE* fp, const char* Mesg) {
@@ -1097,10 +1099,19 @@ void gdcmHeader::ParseHeader(void) {
  *          public tag based hash table.
  */
 void gdcmHeader::LoadElements(void) {
-       rewind(fp);    
+
+       if (DEBUG) printf("LoadElements : Entree\n");
+
+       rewind(fp);   
+       if (DEBUG) printf("LoadElements : rewind\n");
+
        TagElValueHT ht = PubElVals.GetTagHt();
-       for (TagElValueHT::iterator tag = ht.begin(); tag != ht.end(); ++tag)
+       
+       if (DEBUG) printf("LoadElements : GetTagHt\n");
+
+       for (TagElValueHT::iterator tag = ht.begin(); tag != ht.end(); ++tag) {
                LoadElementValue(tag->second);
+               }
 }
 
 void gdcmHeader::PrintPubElVal(ostream & os) {