From f22035516061f75820d0accadee770ddefa06e2b Mon Sep 17 00:00:00 2001 From: jpr Date: Thu, 19 Dec 2002 18:14:15 +0000 Subject: [PATCH] gcdmPutDataHere (A VOIR : comment unifier le code avec GetImageData) --- src/gdcm.h | 3 +- src/gdcmFile.cxx | 116 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 117 insertions(+), 2 deletions(-) diff --git a/src/gdcm.h b/src/gdcm.h index 4bdef369..ae6da2f2 100644 --- a/src/gdcm.h +++ b/src/gdcm.h @@ -526,7 +526,8 @@ public: // Copies (at most MaxSize bytes) of data to caller's memory space. // Returns an error code on failure (if MaxSize is not big enough) - // TODO Swig int PutImageDataHere(void* destination, size_t MaxSize ); + + int PutImageDataHere(void* destination, size_t MaxSize ); // Allocates ExpectedSize bytes of memory at this->Data and copies the // pointed data to it. diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index fad23001..af3f1fef 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -156,7 +156,7 @@ void * gdcmFile::GetImageData (void) { if (nb != 8) { 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 @@ -183,6 +183,120 @@ void * gdcmFile::GetImageData (void) { } +///////////////////////////////////////////////////////////////// +/** + * \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; + 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 + 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); + + // 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(); + + _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"); + + // VOIR s'il ne faudrait pas l'affecter à un champ du dcmHeader + + //return (Pixels); // pour garder le code identique avec GetImageData + return 1; +} + // // Je laisse le code integral, au cas ça puisse etre reutilise ailleurs // -- 2.48.1