X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmFile.cxx;h=4791ca7f5c724da2cb6e17fc6976c69a78e2ba9a;hb=deba96a5f8b1fb7ce4fd411cd3f13872f5437813;hp=031b26554ac0441ac30140b462c36d20a3a81a7f;hpb=9d439450a43135ddd30761ed598dd2bbfcfe26b8;p=gdcm.git diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index 031b2655..4791ca7f 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -2,6 +2,8 @@ #include "gdcm.h" +#define DEBUG 1 + static void _Swap(void* im, int swap, int lgr, int nb); ///////////////////////////////////////////////////////////////// @@ -21,21 +23,11 @@ static void _Swap(void* im, int swap, int lgr, int nb); * * @return */ - -///////////////////////////////////////////////////////////////// -/** - * \ingroup gdcmFile - * \brief constructeur - * - * @param - * - * @return - */ - gdcmFile::gdcmFile(string & filename) :gdcmHeader(filename.c_str()) { + if (DEBUG) printf("On a echappe a gdcmHeader !\n"); } @@ -44,7 +36,7 @@ gdcmFile::gdcmFile(string & filename) * \ingroup gdcmFile * \brief Renvoie la longueur A ALLOUER pour recevoir les pixels de l'image * \ ou DES images dans le cas d'un multiframe - * \ ATTENTION : il ne s'agit PAS de la lgr du groupe des Pixels + * \ ATTENTION : il ne s'agit PAS de la longueur du groupe des Pixels * \ (dans le cas d'images compressees, elle n'a pas de sens). * * @param void Rien en entree @@ -96,7 +88,122 @@ size_t gdcmFile::GetImageDataSize(void) { void * gdcmFile::GetImageData (void) { - char* Pixels; + char* _Pixels; + int nbLignes, nbCol; + + int nbFrames, nb, nbu, highBit, signe; + string str_nbFrames, str_nb, str_nbu, str_highBit, str_signe; + + unsigned short int mask = 0xffff; + + // Nombre de Lignes + nbLignes=atoi(GetPubElValByNumber(0x0028,0x0010).c_str()); + // Nombre de Colonnes + nbCol =atoi(GetPubElValByNumber(0x0028,0x0011).c_str()); + + // Nombre de Frames + str_nbFrames=GetPubElValByNumber(0x0028,0x0008); + + + if (str_nbFrames == "UNFOUND" ) { + nbFrames = 1; + } else { + nbFrames = atoi(str_nbFrames.c_str() ); + } + + // Nombre de Bits Alloues + str_nb=GetPubElValByNumber(0x0028,0x0100); + + if (str_nb == "UNFOUND" ) { + nb = 16; + } else { + nb = atoi(str_nb.c_str() ); + } + + // Nombre de Bits Utilises + str_nbu=GetPubElValByNumber(0x0028,0x0101); + + if (str_nbu == "UNFOUND" ) { + nbu = nb; + } else { + nbu = atoi(str_nbu.c_str() ); + } + + // Position du Bit de Poids Fort + str_highBit=GetPubElValByNumber(0x0028,0x0102); + + if (str_highBit == "UNFOUND" ) { + highBit = nb - 1; + } else { + highBit = atoi(str_highBit.c_str() ); + } + + // Signe des Pixels 0 : Unsigned + str_signe=GetPubElValByNumber(0x0028,0x0103); + + if (str_signe == "UNFOUND" ) { + signe = 1; + } else { + signe = atoi(str_signe.c_str() ); + } + + // Longueur en Octets des Pixels a lire + size_t _lgrTotale = nbFrames*nbLignes*nbCol*(nb/8); + + //Pixels = (char *) g_malloc(_lgrTotale); + _Pixels = (char *) malloc(_lgrTotale); + + 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); + } + + // On remet les Bits des Octets dans le bon ordre si besoin est + // + // ATTENTION : Jamais confronté a des pixels stockes sur 32 bits + // avec moins de 32 bits utilises + // et dont le bit de poids fort ne serait pas la ou on l'attend ... + // --> 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; + for(int i=0;i> (nbu-highBit-1)) & mask; + deb ++; + } + } + + printf ("on est sorti\n"); + + // On l'affecte à un champ du dcmFile + + Pixels = _Pixels; + lgrTotale = _lgrTotale; + + return (_Pixels); +} + + +///////////////////////////////////////////////////////////////// +/** + * \ingroup gdcmFile + * \brief amene en mémoire dans une zone précisee par l'utilisateur + * \les Pixels d'une image NON COMPRESSEE + * \Aucun test n'est fait pour le moment sur le caractere compresse ou non de l'image + * + * @param + * + * @return + */ + +int gdcmFile::PutImageDataHere (void* destination, size_t MaxSize) { + + void * Pixels = destination; // pour garder le code identique avec GetImageData int nbLignes, nbCol; int nbFrames, nb, nbu, highBit, signe; @@ -158,16 +265,18 @@ void * gdcmFile::GetImageData (void) { // Longueur en Octets des Pixels a lire size_t lgrTotale = nbFrames*nbLignes*nbCol*(nb/8); - //Pixels = (char *) g_malloc(lgrTotale); - Pixels = (char *) malloc(lgrTotale); + // si lgrTotale < MaxSize ==> Gros pb . A VOIR + + lgrTotale = MaxSize; // pour garder le code identique avec GetImageData + //Pixels = (char *) malloc(lgrTotale); // pour garder le code identique avec GetImageData GetPixels(lgrTotale, Pixels); // On remet les Octets dans le bon ordre si besoin est if (nb != 8) { - //int sw = GetSwapCode(); + int _sw = GetSwapCode(); - // _Swap (Pixels, sw, lgrTotale, nb); // A REMETTRE + _Swap (Pixels, _sw, lgrTotale, nb); } // On remet les Bits des Octets dans le bon ordre si besoin est @@ -190,10 +299,10 @@ void * gdcmFile::GetImageData (void) { // VOIR s'il ne faudrait pas l'affecter à un champ du dcmHeader - return (Pixels); + //return (Pixels); // pour garder le code identique avec GetImageData + return 1; } - // // Je laisse le code integral, au cas ça puisse etre reutilise ailleurs // @@ -271,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); +} + +