- * \ingroup gdcmHeader
- * \brief builts Red/Green/Blue/Alpha LUT from Header
- * \ when (0028,0004),Photometric Interpretation = [PALETTE COLOR ]
- * \ and (0028,1101),(0028,1102),(0028,1102)
- * \ - xxx Palette Color Lookup Table Descriptor - are found
- * \ and (0028,1201),(0028,1202),(0028,1202)
- * \ - xxx Palette Color Lookup Table Data - are found
- * \warning does NOT deal with :
- * \ 0028 1100 Gray Lookup Table Descriptor (Retired)
- * \ 0028 1221 Segmented Red Palette Color Lookup Table Data
- * \ 0028 1222 Segmented Green Palette Color Lookup Table Data
- * \ 0028 1223 Segmented Blue Palette Color Lookup Table Data
- * \ no known Dicom reader deails with them :-(
- * @return Lookup Table RGBA
- */
-
-unsigned char * gdcmHeader::GetLUTRGBA(void) {
-// Not so easy : see
-// http://www.barre.nom.fr/medical/dicom2/limitations.html#Color%20Lookup%20Tables
-// and OT-PAL-8-face.dcm
-
-// if Photometric Interpretation # PALETTE COLOR, no LUT to be done
-
- if (gdcmHeader::GetPubElValByNumber(0x0028,0x0004) != "PALETTE COLOR ") {
- return NULL;
- }
-
- 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
-
- unsigned char *LUTRGBA = (unsigned char *)calloc(1024,1); // 256 * 4 (R, G, B, Alpha)
- if (!LUTRGBA) {
- return NULL;
- }
- memset(LUTRGBA, 0, 1024);
- // 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
-
- unsigned char *a;
- int i;
- a= LUTRGBA+0;
- for(i=0;i<lengthR;i++) {
- *a = lutR[i*mult+1];
- a+=4;
- }
- a= LUTRGBA+1;
- for(i=0;i<lengthG;i++) {
- *a = lutG[i*mult+1];
- a+=4;
- }
- a= LUTRGBA+2;
- for(i=0;i<lengthB;i++) {
- *a = lutB[i*mult+1];
- a+=4;
- }
- a= LUTRGBA+3;
- for(i=0;i<256;i++) {
- *a = 1; // Alpha component
- a+=4;
- }
-
-//How to free the now useless LUTs?
-//
-//free(LutR); free(LutB); free(LutG);
+ * \brief Accesses the info from 0002,0010 : Transfert Syntax and TS
+ * else 1.
+ * @return The full Transfert Syntax Name (as opposed to Transfert Syntax UID)
+ */
+std::string Header::GetTransfertSyntaxName()
+{
+ // use the TS (TS : Transfert Syntax)
+ std::string transfertSyntax = GetEntryByNumber(0x0002,0x0010);
+
+ if ( transfertSyntax == GDCM_NOTLOADED )
+ {
+ std::cout << "Transfert Syntax not loaded. " << std::endl
+ << "Better you increase MAX_SIZE_LOAD_ELEMENT_VALUE"
+ << std::endl;
+ return "Uncompressed ACR-NEMA";
+ }
+ if ( transfertSyntax == GDCM_UNFOUND )
+ {
+ dbg.Verbose(0, "Header::GetTransfertSyntaxName:"
+ " unfound Transfert Syntax (0002,0010)");
+ return "Uncompressed ACR-NEMA";
+ }
+
+ while ( ! isdigit((unsigned char)transfertSyntax[transfertSyntax.length()-1]) )
+ {
+ transfertSyntax.erase(transfertSyntax.length()-1, 1);
+ }
+ // we do it only when we need it
+ TS* ts = Global::GetTS();
+ std::string tsName = ts->GetValue( transfertSyntax );
+
+ //delete ts; /// \todo Seg Fault when deleted ?!
+ return tsName;
+}
+
+//-----------------------------------------------------------------------------
+// Protected