-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 == "gdcm::Unfound" ) {
- nbFrames = 1;
- } else {
- nbFrames = atoi(str_nbFrames.c_str() );
- }
-
- // Nombre de Bits Alloues
- str_nb=GetPubElValByNumber(0x0028,0x0100);
-
- if (str_nb == "gdcm::Unfound" ) {
- nb = 16;
- } else {
- nb = atoi(str_nb.c_str() );
- }
-
- // Nombre de Bits Utilises
- str_nbu=GetPubElValByNumber(0x0028,0x0101);
-
- if (str_nbu == "gdcm::Unfound" ) {
- nbu = nb;
- } else {
- nbu = atoi(str_nbu.c_str() );
- }
-
- // Position du Bit de Poids Fort
- str_highBit=GetPubElValByNumber(0x0028,0x0102);
-
- if (str_highBit == "gdcm::Unfound" ) {
- highBit = nb - 1;
- } else {
- highBit = atoi(str_highBit.c_str() );
- }
-
- // Signe des Pixels
- str_signe=GetPubElValByNumber(0x0028,0x0103);
-
- if (str_signe == "gdcm::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;
+/**
+ * \brief - Allocates necessary memory,
+ * - Reads the pixels from disk (uncompress if necessary),
+ * - Transforms YBR pixels, if any, into RGB pixels
+ * - Transforms 3 planes R, G, B, if any, into a single RGB Plane
+ * - Transforms single Grey plane + 3 Palettes into a RGB Plane
+ * - Copies the pixel data (image[s]/volume[s]) to newly allocated zone.
+ * @return Pointer to newly allocated pixel data.
+ * NULL if alloc fails
+ */
+uint8_t* File::GetImageData()
+{
+ if ( ! GetDecompressed() )
+ {
+ // If the decompression failed nothing can be done.
+ return 0;
+ }
+
+ uint8_t* pixelData;
+ if ( HeaderInternal->HasLUT() && PixelConverter->BuildRGBImage() )
+ {
+ pixelData = PixelConverter->GetRGB();
+ }
+ else
+ {
+ // When no LUT or LUT conversion fails, return the decompressed
+ pixelData = PixelConverter->GetDecompressed();
+ }
+
+// PIXELCONVERT CLEANME
+ // Restore the header in a disk-consistent state
+ // (if user asks twice to get the pixels from disk)
+ if ( PixelRead != -1 ) // File was "read" before
+ {
+ RestoreInitialValues();
+ }
+ if ( PixelConverter->GetRGB() )
+ {
+ // now, it's an RGB image
+ // Lets's write it in the Header
+ std::string spp = "3"; // Samples Per Pixel
+ HeaderInternal->SetEntryByNumber(spp,0x0028,0x0002);
+ std::string rgb = "RGB "; // Photometric Interpretation
+ HeaderInternal->SetEntryByNumber(rgb,0x0028,0x0004);
+ std::string planConfig = "0"; // Planar Configuration
+ HeaderInternal->SetEntryByNumber(planConfig,0x0028,0x0006);
+ PixelRead = 0; // no PixelRaw
+ }
+ else
+ {
+ if ( HeaderInternal->HasLUT() )
+ {
+ // The LUT interpretation failed
+ std::string photometricInterpretation = Util::DicomString("MONOCHROME1");
+ HeaderInternal->SetEntryByNumber( photometricInterpretation,
+ 0x0028, 0x0004 );
+ PixelRead = 0; // no PixelRaw
+ }
+ else
+ {
+ if ( PixelConverter->IsDecompressedRGB() )
+ {
+ ///////////////////////////////////////////////////
+ // now, it's an RGB image
+ // Lets's write it in the Header
+ // Droping Palette Color out of the Header
+ // has been moved to the Write process.
+ // TODO : move 'values' modification to the write process
+ // : save also (in order to be able to restore)
+ // : 'high bit' -when not equal to 'bits stored' + 1
+ // : 'bits allocated', when it's equal to 12 ?!
+ std::string spp = "3"; // Samples Per Pixel
+ std::string photInt = "RGB "; // Photometric Interpretation
+ std::string planConfig = "0"; // Planar Configuration
+ HeaderInternal->SetEntryByNumber(spp,0x0028,0x0002);
+ HeaderInternal->SetEntryByNumber(photInt,0x0028,0x0004);
+ HeaderInternal->SetEntryByNumber(planConfig,0x0028,0x0006);
+ }
+ PixelRead = 1; // PixelRaw
+ }
+ }
+
+ // We say the value *is* loaded.
+ SetPixelData(pixelData);
+// END PIXELCONVERT CLEANME
+
+ return pixelData;