// 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
// 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.
// fabrique une ligne de Dictionnaire Dicom à partir des parametres en entrée
-
gdcmDictEntry(guint16 group, guint16 element,
string vr = "Unknown",
string fourth = "Unknown",
//
// 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
// 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)
//
// 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
// ---------------------------------------------------- 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.
// (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
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)
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;
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();
// 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);
};
//
#include "gdcm.h"
+#define DEBUG 1
+
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");
}
void * gdcmFile::GetImageData (void) {
- char* Pixels;
+ char* _Pixels;
int nbLignes, nbCol;
int nbFrames, nb, nbu, highBit, signe;
highBit = atoi(str_highBit.c_str() );
}
- // Signe des Pixels
+ // Signe des Pixels 0 : Unsigned
str_signe=GetPubElValByNumber(0x0028,0x0103);
if (str_signe == "UNFOUND" ) {
}
// 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
// --> 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 ++;
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);
}
+
+/////////////////////////////////////////////////////////////////
+/**
+ * \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);
+}
+
+