- // ------------------------------- JPEG Lossy : call to IJG 6b
-
- long fragmentBegining; // for ftell, fseek
- bool b = gdcmHeader::IsJPEG2000();
-
- bool res;
- guint16 ItemTagGr,ItemTagEl;
- int ln; // Position on begining of Jpeg Pixels
-
- fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
- fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
- if(GetSwapCode()) {
- ItemTagGr=SwapShort(ItemTagGr);
- ItemTagEl=SwapShort(ItemTagEl);
- }
- fread(&ln,4,1,fp);
- if(GetSwapCode())
- ln=SwapLong(ln); // Basic Offset Table Item length
-
- if (ln != 0) {
- // What is it used for ?!?
- char *BasicOffsetTableItemValue = (char *)malloc(ln+1);
- fread(BasicOffsetTableItemValue,ln,1,fp);
- }
-
- // first Fragment initialisation
- fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
- fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
- if(GetSwapCode()) {
- ItemTagGr=SwapShort(ItemTagGr);
- ItemTagEl=SwapShort(ItemTagEl);
- }
-
- // parsing fragments until Sequence Delim. Tag found
- //unsigned short *dest = (unsigned short *)destination;
-
- while ( ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) {
- fread(&ln,4,1,fp);
- if(GetSwapCode())
- ln=SwapLong(ln); // Fragment Item length
-
- // FIXME : multi fragments
- fragmentBegining=ftell(fp);
-
-
- if (b)
- res = (bool)gdcm_read_JPEG2000_file (destination); // Reading Fragment pixels
-
- else if (IsJPEGLossless()) {
- // ------------- call to LibIDO Jpeg for each Frame/fragment
-
- // Warning : Works only if there is one fragment per frame
- // (Or a single fragment for the multiframe file)
- ClbJpeg* jpg = _IdDcmJpegRead(fp); // TODO : find a 'full' one.
- // (We use the LibIDO one :-(
- if(jpg == NULL) {
- CloseFile();
- return false;
- }
- int * dataJpg = jpg->DataImg;
- unsigned short *dest = (unsigned short *)destination;
- switch (nBytes) {
- case 1:
- {
- for (int i=0; i<taille; i++) {
- *((unsigned char *)dest+i) = *(dataJpg +i);
- }
- break;
- }
-
- case 2:
- {
- for (int i=0; i<taille; i++) {
- *((unsigned short *)dest+i) = *(dataJpg +i);
- }
- break;
- }
- }
- _IdDcmJpegFree (jpg);
-
- } // ------------------------------------- endif (IsJPEGLossless())
-
- else
- if (GetBitsStored() == 8) {
- res = (bool)gdcm_read_JPEG_file (destination); // Reading Fragment pixels
- } else {
- res = (bool)gdcm_read_JPEG_file12 (destination);// Reading Fragment pixels
- }
-
- if (!res) break;
-
- // FIXME : will work only when each fragment corresponds to a Frame :-(
-
- destination = (char *)destination + taille * nBytes; // location in user's memory
- // for next fragment (if any)
- // TODO : find a suitable file (multifragment/single Frame Jpeg file) to check
-
- fseek(fp,fragmentBegining,SEEK_SET); // To be sure we start
- fseek(fp,ln,SEEK_CUR); // at the begining of next fragment
-
- ItemTagGr = ItemTagEl =0;
- fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
- fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
- if(GetSwapCode()) {
- ItemTagGr=SwapShort(ItemTagGr);
- ItemTagEl=SwapShort(ItemTagEl);
- }
-
- //(char *) destination += taille * nBytes;
- //std::cout << "destination" << destination << std::endl;
- }
-
- return res;
-}
+ std::string spp = "3"; // Samples Per Pixel
+ HeaderInternal->SetEntryByNumber(spp,0x0028,0x0002);
+ std::string rgb = "RGB "; // Photometric Interpretation
+ HeaderInternal->SetEntryByNumber(rgb,0x0028,0x0004);
+ std::string planConfig = "0"; // Planar Configuration
+ HeaderInternal->SetEntryByNumber(planConfig,0x0028,0x0006);
+
+ }
+ else // GetLUTRGBA() failed
+ {
+ // (gdcm-US-ALOKA-16.dcm), contains Segmented xxx Palette Color
+ // that are *more* than 65535 long ?!?
+ // No idea how to manage such an image !
+ // Need to make RGB Pixels (?) from grey Pixels (?!) and Gray Lut (!?!)
+ // It seems that *no Dicom Viewer* has any idea :-(
+
+ std::string photomInterp = "MONOCHROME1 "; // Photometric Interpretation
+ HeaderInternal->SetEntryByNumber(photomInterp,0x0028,0x0004);
+ }
+
+ /// \todo Drop Palette Color out of the Header?
+ return ImageDataSize;
+}