]> Creatis software - gdcm.git/commitdiff
gcdmPutDataHere
authorjpr <jpr>
Thu, 19 Dec 2002 18:14:15 +0000 (18:14 +0000)
committerjpr <jpr>
Thu, 19 Dec 2002 18:14:15 +0000 (18:14 +0000)
(A VOIR : comment unifier le code avec GetImageData)

src/gdcm.h
src/gdcmFile.cxx

index 4bdef369ecc046d76f6d1cdecd32b3dcd33b19bd..ae6da2f2998602d46c2a53e1bdca1bc0f3db40a9 100644 (file)
@@ -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.
index fad23001113e8e3501fbeeeed717408723f1d809..af3f1fefed9617492feab70acec76c88d6ee5b1a 100644 (file)
@@ -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<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
+       
+       //return (Pixels);                              // pour garder le code identique avec GetImageData      
+       return 1; 
+}
+
 //
 // Je laisse le code integral, au cas ça puisse etre reutilise ailleurs
 //