- if (Header->HasLUT()) {
- lgrTotale*=3;
- }
-}
-
-/**
- * \ingroup gdcmFile
- * \brief Returns the size (in bytes) of required memory to hold
- * the pixel data represented in this file.
- * @return The size of pixel data in bytes.
- */
-size_t gdcmFile::GetImageDataSize(void) {
- return (lgrTotale);
-}
-
-/**
- * \ingroup gdcmFile
- * \brief Returns the size (in bytes) of required memory to hold
- * the pixel data represented in this file, when user DOESN'T want
- * to get RGB pixels image when it's stored as a PALETTE COLOR image
- * -the (vtk) user is supposed to know how deal with LUTs-
- * \warning to be used with GetImagePixelsRaw()
- * @return The size of pixel data in bytes.
- */
-size_t gdcmFile::GetImageDataSizeRaw(void) {
- return (lgrTotaleRaw);
-}
-
-/**
- * \ingroup gdcmFile
- * \brief Allocates necessary memory, copies the pixel data
- * (image[s]/volume[s]) to newly allocated zone.
- * Transforms YBR pixels into RGB pixels if any
- * Transforms 3 planes R, G, B into a single RGB Plane
- * Transforms single Grey plane + 3 Palettes into a RGB Plane
- * @return Pointer to newly allocated pixel data.
- * NULL if alloc fails
- */
-void * gdcmFile::GetImageData (void) {
- PixelData = (void *) malloc(lgrTotale);
- if (PixelData)
- GetImageDataIntoVector(PixelData, lgrTotale);
- PixelRead=0; // no PixelRaw
- return(PixelData);
-}
-
-/**
- * \ingroup gdcmFile
- * \brief Copies at most MaxSize bytes of pixel data to caller's
- * memory space.
- * \warning This function was designed to avoid people that want to build
- * a volume from an image stack to need first to get the image pixels
- * and then move them to the volume area.
- * It's absolutely useless for any VTK user since vtk chooses
- * to invert the lines of an image, that is the last line comes first
- * (for some axis related reasons?). Hence he will have
- * to load the image line by line, starting from the end.
- * VTK users have to call GetImageData
- *
- * @param destination Address (in caller's memory space) at which the
- * pixel data should be copied
- * @param MaxSize Maximum number of bytes to be copied. When MaxSize
- * is not sufficient to hold the pixel data the copy is not
- * executed (i.e. no partial copy).
- * @return On success, the number of bytes actually copied. Zero on
- * failure e.g. MaxSize is lower than necessary.
- */
-size_t gdcmFile::GetImageDataIntoVector (void* destination, size_t MaxSize) {
- size_t l = GetImageDataIntoVectorRaw (destination, MaxSize);
- PixelRead=0 ; // no PixelRaw
- if (!Header->HasLUT())
- return lgrTotale;
-
- // from Lut R + Lut G + Lut B
- unsigned char * newDest = (unsigned char *)malloc(lgrTotale);
- unsigned char * a = (unsigned char *)destination;
- unsigned char * lutRGBA = Header->GetLUTRGBA();
- if (lutRGBA) {
- int l = lgrTotaleRaw;
- memmove(newDest, destination, l);// move Gray pixels to temp area
- int j;
- for (int i=0;i<l; i++) { // Build RGB Pixels
- j=newDest[i]*4;
- *a++ = lutRGBA[j];
- *a++ = lutRGBA[j+1];
- *a++ = lutRGBA[j+2];
- }
- free(newDest);
-
- // now, it's an RGB image
- // Lets's write it in the Header
-
- // CreateOrReplaceIfExist ?
-
- std::string spp = "3"; // Samples Per Pixel
- Header->SetEntryByNumber(spp,0x0028,0x0002);
- std::string rgb= "RGB "; // Photometric Interpretation
- Header->SetEntryByNumber(rgb,0x0028,0x0004);
- std::string planConfig = "0"; // Planar Configuration
- Header->SetEntryByNumber(planConfig,0x0028,0x0006);
-
- } else {
- // need to make RGB Pixels (?)
- // from grey Pixels (?!)
- // and Gray Lut (!?!)
- // or Segmented xxx Palette Color Lookup Table Data and so on
-
- // Oops! I get one (gdcm-US-ALOKA-16.dcm)
- // No idea how to manage such an image
- // It seems that *no Dicom Viewer* has any idea :-(
- // Segmented xxx Palette Color are *more* than 65535 long ?!?
-
- std::string rgb= "MONOCHROME1 "; // Photometric Interpretation
- Header->SetEntryByNumber(rgb,0x0028,0x0004);
- }
- // TODO : Drop Palette Color out of the Header?
- return lgrTotale;
-}
-
-/**
- * \ingroup gdcmFile
- * \brief Allocates necessary memory, copies the pixel data
- * (image[s]/volume[s]) to newly allocated zone.
- * Transforms YBR pixels into RGB pixels if any
- * Transforms 3 planes R, G, B into a single RGB Plane
- * DOES NOT transform Grey plane + 3 Palettes into a RGB Plane
- * @return Pointer to newly allocated pixel data.
- * \ NULL if alloc fails
- */
-void * gdcmFile::GetImageDataRaw (void) {
- if (Header->HasLUT())
- lgrTotale /= 3; // TODO Let gdcmHeadar user a chance
- // to get the right value
- // Create a member lgrTotaleRaw ???
- PixelData = (void *) malloc(lgrTotale);
- if (PixelData)
- GetImageDataIntoVectorRaw(PixelData, lgrTotale);
- PixelRead=1; // PixelRaw
- return(PixelData);
-}
-
-/**
- * \ingroup gdcmFile
- * \brief Copies at most MaxSize bytes of pixel data to caller's
- * memory space.
- * \warning This function was designed to avoid people that want to build
- * a volume from an image stack to need first to get the image pixels
- * and then move them to the volume area.
- * It's absolutely useless for any VTK user since vtk chooses
- * to invert the lines of an image, that is the last line comes first
- * (for some axis related reasons?). Hence he will have
- * to load the image line by line, starting from the end.
- * VTK users hace to call GetImageData
- * \warning DOES NOT transform the Grey Plane + Palette Color (if any)
- * into a single RGB Pixels Plane
- * the (VTK) user will manage the palettes
- *
- * @param destination Address (in caller's memory space) at which the
- * pixel data should be copied
- * @param MaxSize Maximum number of bytes to be copied. When MaxSize
- * is not sufficient to hold the pixel data the copy is not
- * executed (i.e. no partial copy).
- * @return On success, the number of bytes actually copied. Zero on
- * failure e.g. MaxSize is lower than necessary.
- */
-size_t gdcmFile::GetImageDataIntoVectorRaw (void* destination, size_t MaxSize) {
-
- int nb, nbu, highBit, signe;
- std::string str_nbFrames, str_nb, str_nbu, str_highBit, str_signe;
- PixelRead=1 ; // PixelRaw
-
- if ( lgrTotale > MaxSize ) {
- dbg.Verbose(0, "gdcmFile::GetImageDataIntoVector: pixel data bigger"
- "than caller's expected MaxSize");
- return (size_t)0;
- }
-
- (void)ReadPixelData(destination);
-
- // Number of Bits Allocated for storing a Pixel
- str_nb = Header->GetEntryByNumber(0x0028,0x0100);
- if (str_nb == GDCM_UNFOUND ) {
- nb = 16;
- } else {
- nb = atoi(str_nb.c_str() );
- }
- // Number of Bits actually used
- str_nbu=Header->GetEntryByNumber(0x0028,0x0101);
- if (str_nbu == GDCM_UNFOUND ) {
- nbu = nb;
- } else {
- nbu = atoi(str_nbu.c_str() );
- }
- // High Bit Position
- str_highBit=Header->GetEntryByNumber(0x0028,0x0102);
- if (str_highBit == GDCM_UNFOUND ) {
- highBit = nb - 1;
- } else {
- highBit = atoi(str_highBit.c_str() );
- }
- // Pixel sign
- // 0 = Unsigned
- // 1 = Signed
- str_signe=Header->GetEntryByNumber(0x0028,0x0103);
- if (str_signe == GDCM_UNFOUND ) {
- signe = 0; // default is unsigned
- } else {
- signe = atoi(str_signe.c_str() );
- }
-
- // re arange bytes inside the integer (processor endianity)
- if (nb != 8)
- SwapZone(destination, Header->GetSwapCode(), lgrTotale, nb);
-
- // to avoid pb with some xmedcon breakers images
- if (nb==16 && nbu<nb && signe==0) {
- int l = (int)lgrTotale / (nb/8);
- guint16 *deb = (guint16 *)destination;
- for(int i = 0; i<l; i++) {
- if(*deb == 0xffff)
- *deb=0;
- deb++;
- }