- StrImPos = GetPubElValByNumber(0x0020,0x0030); // For ACR-NEMA images
- if (StrImPos != "gdcm::Unfound") {
- if( sscanf( StrImPos.c_str(), "%f\\%f\\%f", &xImPos, &yImPos, &zImPos) != 3) {
- dbg.Verbose(0, "gdcmHeader::GetZImagePosition: wrong Image Position (RET) (0020,0030)");
- return 0.; // bug in the element 0x0020,0x0032
- } else {
- return zImPos;
- }
- }
- string StrSliceLocation = GetPubElValByNumber(0x0020,0x1041);// for *very* old ACR-NEMA images
- if (StrSliceLocation != "gdcm::Unfound") {
- if( sscanf( StrSliceLocation.c_str(), "%f", &zImPos) !=1) {
- dbg.Verbose(0, "gdcmHeader::GetZImagePosition: wrong Slice Location (0020,1041)");
- return 0.; // bug in the element 0x0020,0x1041
- } else {
- return zImPos;
- }
- }
- dbg.Verbose(0, "gdcmHeader::GetZImagePosition: unfound Slice Location (0020,1041)");
- string StrLocation = GetPubElValByNumber(0x0020,0x0050);
- if (StrLocation != "gdcm::Unfound") {
- if( sscanf( StrLocation.c_str(), "%f", &zImPos) !=1) {
- dbg.Verbose(0, "gdcmHeader::GetZImagePosition: wrong Location (0020,0050)");
- return 0.; // bug in the element 0x0020,0x0050
- } else {
- return zImPos;
- }
- }
- dbg.Verbose(0, "gdcmHeader::GetYImagePosition: unfound Location (0020,0050)");
- return 0.; // Hopeless
-}
-
-
+
+ void * LutR,*LutG,*LutB;
+ int l;
+ int lengthR, debR, nbitsR;
+ int lengthG, debG, nbitsG;
+ int lengthB, debB, nbitsB;
+
+// Get info from Lut Descriptors
+// (the 3 LUT descriptors may be different)
+
+ std::string LutDescriptionR = GetPubElValByNumber(0x0028,0x1101);
+ if (LutDescriptionR == GDCM_UNFOUND)
+ return NULL;
+ std::string LutDescriptionG = GetPubElValByNumber(0x0028,0x1102);
+ if (LutDescriptionG == GDCM_UNFOUND)
+ return NULL;
+ std::string LutDescriptionB = GetPubElValByNumber(0x0028,0x1103);
+ if (LutDescriptionB == GDCM_UNFOUND)
+ return NULL;
+
+ std::vector<std::string> tokens;
+
+ tokens.erase(tokens.begin(),tokens.end()); // clean any previous value
+ Tokenize (LutDescriptionR, tokens, "\\");
+ lengthR=atoi(tokens[0].c_str()); // Red LUT length in Bytes
+ debR =atoi(tokens[1].c_str()); // subscript of the first Lut Value
+ nbitsR =atoi(tokens[2].c_str()); // Lut item size (in Bits)
+ tokens.clear();
+
+ tokens.erase(tokens.begin(),tokens.end()); // clean any previous value
+ Tokenize (LutDescriptionG, tokens, "\\");
+ lengthG=atoi(tokens[0].c_str()); // Green LUT length in Bytes
+ debG =atoi(tokens[1].c_str());
+ nbitsG =atoi(tokens[2].c_str());
+ tokens.clear();
+
+ tokens.erase(tokens.begin(),tokens.end()); // clean any previous value
+ Tokenize (LutDescriptionB, tokens, "\\");
+ lengthB=atoi(tokens[0].c_str()); // Blue LUT length in Bytes
+ debB =atoi(tokens[1].c_str());
+ nbitsB =atoi(tokens[2].c_str());
+ tokens.clear();
+
+// Load LUTs into memory, (as they were stored on disk)
+
+ unsigned char *lutR =(unsigned char *)
+ GetPubElValVoidAreaByNumber(0x0028,0x1201);
+ unsigned char *lutG =(unsigned char *)
+ GetPubElValVoidAreaByNumber(0x0028,0x1202);
+ unsigned char *lutB =(unsigned char *)
+ GetPubElValVoidAreaByNumber(0x0028,0x1203);
+
+ if (!lutR || !lutG || !lutB ) {
+ return NULL;
+ }
+ // forge the 4 * 8 Bits Red/Green/Blue/Alpha LUT
+
+ char *LUTRGBA = (char *)calloc(1024,1); // 256 * 4 (R, G, B, Alpha)
+ if (!LUTRGBA) {
+ return NULL;
+ }
+ // Bits Allocated
+ int nb;
+ std::string str_nb = GetPubElValByNumber(0x0028,0x0100);
+ if (str_nb == GDCM_UNFOUND ) {
+ nb = 16;
+ } else {
+ nb = atoi(str_nb.c_str() );
+ }
+ int mult;
+
+ if (nbitsR==16 && nb==8) // when LUT item size is different than pixel size
+ mult=2; // high byte must be = low byte
+ else // See PS 3.3-2003 C.11.1.1.2 p 619
+ mult=1;
+
+
+ // if we get a black image, let's just remove the '+1'
+ // from 'i*mult+1' and check again
+ // if it works, we shall have to check the 3 Palettes
+ // to see which byte is ==0 (first one, or second one)
+ // and fix the code
+ // We give up the checking to avoid some overhead
+ char *a;
+ a= LUTRGBA+debR;
+ for(int i=0;i<lengthR;i++) {
+ *a = lutR[i*mult+1];
+ a+=4;
+ }
+ a= LUTRGBA+debG;
+ for(int i=0;i<lengthG;i++) {
+ *(a+1) = lutG[i*mult+1];
+ a+=4;
+ }
+ a= LUTRGBA+debB;
+ for(int i=0;i<lengthB;i++) {
+ *(a+2) = lutB[i*mult+1];
+ a+=4;
+ }
+ for(int i=0;i<255;i++) {
+ *(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");