From: jpr Date: Fri, 31 Oct 2003 10:38:34 +0000 (+0000) Subject: * ENH : Add the functions gdcmFile::GetImageDataRaw X-Git-Tag: Version0.3.1~63 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=0add622a61a208e9ed5f55b1b48e373b6bf38f39;p=gdcm.git * ENH : Add the functions gdcmFile::GetImageDataRaw gdcmFile::GetImageDataIntoVectorRaw that act as GetImageData and GetImageDataIntoVector except the making of an RGB Plane from Gray Plane + LUT Intended to aware (vtk) users who know how to manage such an image : After gdcmHeader : GetLUTRGBA return a R,G,B,A LUT if any lgrTotaleRaw gives the 'Raw' length GetImageDataRaw returns the gray Plane * FIX : no more dirty trick for 'Segmented xxx Palette Color Lookup' images (They stay Grey, just like with other Dicom viewers :-( * FIX : a VC++ intended syntax modif broke the 12/12 Bytes expanding --- diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index da30b3d0..96eb5478 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -56,11 +56,15 @@ void gdcmFile::SetPixelDataSizeFromHeader(void) { nb = atoi(str_nb.c_str() ); if (nb == 12) nb =16; } - lgrTotale = GetXSize() * GetYSize() * GetZSize() + lgrTotale = lgrTotaleRaw = GetXSize() * GetYSize() * GetZSize() * (nb/8)* GetSamplesPerPixel(); std::string str_PhotometricInterpretation = gdcmHeader::GetPubElValByNumber(0x0028,0x0004); - if ( str_PhotometricInterpretation == "PALETTE COLOR " ) { + + /*if ( str_PhotometricInterpretation == "PALETTE COLOR " )*/ + // pb when undealt Segmented Palette Color + + if (HasLUT()) { lgrTotale*=3; } } @@ -286,6 +290,9 @@ bool gdcmFile::ReadPixelData(void* destination) { * \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 */ @@ -296,6 +303,27 @@ void * gdcmFile::GetImageData (void) { return(PixelData); } +/** + * \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 (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); + return(PixelData); +} + /** * \ingroup gdcmFile * \brief Copies at most MaxSize bytes of pixel data to caller's @@ -303,11 +331,11 @@ void * gdcmFile::GetImageData (void) { * \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 VTK users since vtk chooses + * 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 + * VTK users have to call GetImageData * * @param destination Address (in caller's memory space) at which the * pixel data should be copied @@ -320,6 +348,90 @@ void * gdcmFile::GetImageData (void) { size_t gdcmFile::GetImageDataIntoVector (void* destination, size_t MaxSize) { + size_t l = GetImageDataIntoVectorRaw (destination, MaxSize); + + if (!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 = (unsigned char *)GetLUTRGBA(); + + if (lutRGBA) { + int l = lgrTotale/3; + memmove(newDest, destination, l);// move Gray pixels to temp area + int j; + for (int i=0;iData and copies the // pointed data to it. Copying the image might look useless but diff --git a/src/gdcmHeader.cxx b/src/gdcmHeader.cxx index d9e26448..c93c47d9 100644 --- a/src/gdcmHeader.cxx +++ b/src/gdcmHeader.cxx @@ -1,4 +1,4 @@ -// $Header: /cvs/public/gdcm/src/Attic/gdcmHeader.cxx,v 1.104 2003/10/30 17:04:21 jpr Exp $ +// $Header: /cvs/public/gdcm/src/Attic/gdcmHeader.cxx,v 1.105 2003/10/31 10:38:34 jpr Exp $ #include "gdcmHeader.h" @@ -394,7 +394,7 @@ void gdcmHeader::FindVR( gdcmElValue *ElVal) { fseek(fp, PositionOnEntry, SEEK_SET); // When this element is known in the dictionary we shall use, e.g. for - // the semantics (see the usage of IsAnInteger), the vr proposed by the + // the semantics (see the usage of IsAnInteger), the vr proposed by the // dictionary entry. Still we have to flag the element as implicit since // we know now our assumption on expliciteness is not furfilled. // avoid . @@ -2289,10 +2289,6 @@ void * gdcmHeader::GetLUTRGBA(void) { *(a+3) = 1; // Alpha component a+=4; } - -for (int i=0;i<255;i++) - printf ( "%d %02x %02x %02x %02x \n", - i,(LUTRGBA+i*4)[0],(LUTRGBA+i*4)[1],(LUTRGBA+i*4)[2],(LUTRGBA+i*4)[3]); // WHY does it seg fault ?!? //free(LutR); free(LutB); free(LutG); printf ("libere\n");