X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmHeader.cxx;h=21227e47a86f7d6994475e3892296914c1ffe2eb;hb=dd2ef610b9d1f7be02fc7d620129f3ea8b4a5376;hp=b6801f8b88955802c6ee3ac9e19aa0aee749e7ef;hpb=1d69b92978803204089d270599133917d944c651;p=gdcm.git diff --git a/src/gdcmHeader.cxx b/src/gdcmHeader.cxx index b6801f8b..21227e47 100644 --- a/src/gdcmHeader.cxx +++ b/src/gdcmHeader.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmHeader.cxx,v $ Language: C++ - Date: $Date: 2004/10/12 04:35:46 $ - Version: $Revision: 1.193 $ + Date: $Date: 2004/10/22 03:05:41 $ + Version: $Revision: 1.195 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -102,7 +102,7 @@ Header::~Header () * @param filetype Type of the File to be written * (ACR-NEMA, ExplicitVR, ImplicitVR) */ -void Header::Write(FILE* fp,FileType filetype) +void Header::Write(std::ofstream* fp,FileType filetype) { // Bits Allocated if ( GetEntryByNumber(0x0028,0x0100) == "12") @@ -1127,169 +1127,6 @@ int Header::GetLUTNbits() return lutNbits; } -/** - * \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 deals with them :-( - * @return a RGBA Lookup Table - */ -uint8_t* Header::GetLUTRGBA() -{ - // Not so easy : see - // http://www.barre.nom.fr/medical/dicom2/limitations.html#Color%20Lookup%20Tables - -// if Photometric Interpretation # PALETTE COLOR, no LUT to be done - if ( GetEntryByNumber(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 = GetEntryByNumber(0x0028,0x1101); - if ( lutDescriptionR == GDCM_UNFOUND ) - { - return NULL; - } - - std::string lutDescriptionG = GetEntryByNumber(0x0028,0x1102); - if ( lutDescriptionG == GDCM_UNFOUND ) - { - return NULL; - } - - std::string lutDescriptionB = GetEntryByNumber(0x0028,0x1103); - if ( lutDescriptionB == GDCM_UNFOUND ) - { - return NULL; - } - - // lengthR: Red LUT length in Bytes - // debR: subscript of the first Lut Value - // nbitsR: Lut item size (in Bits) - int nbRead = sscanf( lutDescriptionR.c_str(), "%d\\%d\\%d", - &lengthR, &debR, &nbitsR ); - if( nbRead != 3 ) - { - dbg.Verbose(0, "Header::GetLUTRGBA: trouble reading red LUT"); - } - - // lengthG: Green LUT length in Bytes - // debG: subscript of the first Lut Value - // nbitsG: Lut item size (in Bits) - nbRead = sscanf( lutDescriptionG.c_str(), "%d\\%d\\%d", - &lengthG, &debG, &nbitsG ); - if( nbRead != 3 ) - { - dbg.Verbose(0, "Header::GetLUTRGBA: trouble reading green LUT"); - } - - // lengthB: Blue LUT length in Bytes - // debB: subscript of the first Lut Value - // nbitsB: Lut item size (in Bits) - nbRead = sscanf( lutDescriptionB.c_str(), "%d\\%d\\%d", - &lengthB, &debB, &nbitsB ); - if( nbRead != 3 ) - { - dbg.Verbose(0, "Header::GetLUTRGBA: trouble reading blue LUT"); - } - - // Load LUTs into memory, (as they were stored on disk) - uint8_t* lutR = (uint8_t*) GetEntryBinAreaByNumber(0x0028,0x1201); - uint8_t* lutG = (uint8_t*) GetEntryBinAreaByNumber(0x0028,0x1202); - uint8_t* lutB = (uint8_t*) GetEntryBinAreaByNumber(0x0028,0x1203); - - if ( !lutR || !lutG || !lutB ) - { - dbg.Verbose(0, "Header::GetLUTRGBA: trouble with one of the LUT"); - return NULL; - } - // forge the 4 * 8 Bits Red/Green/Blue/Alpha LUT - - uint8_t* LUTRGBA = new uint8_t[1024]; // 256 * 4 (R, G, B, Alpha) - if ( !LUTRGBA ) - { - return NULL; - } - memset(LUTRGBA, 0, 1024); - - // Bits Allocated - int nb; - std::string str_nb = GetEntryByNumber(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 (useless ?)overhead - // (optimistic asumption) - uint8_t* 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; - } - return LUTRGBA; -} - /** * \brief Accesses the info from 0002,0010 : Transfert Syntax and TS * else 1.