- // ----------------------------- JPEG Compressed File .
-
- int nb;
- string str_nb=gdcmHeader::GetPubElValByNumber(0x0028,0x0100);
- if (str_nb == "gdcm::Unfound" ) {
- nb = 16;
- } else {
- nb = atoi(str_nb.c_str() );
- if (nb == 12) nb =16;
- }
- int nBytes= nb/8;
-
- //int taille = GetXSize() * GetYSize() * GetZSize() * GetSamplesPerPixel();
- int taille = GetXSize() * GetYSize() * GetSamplesPerPixel();
-
-
- // ------------------------------- JPEG LossLess : call to Jpeg Libido
-
- if (IsJPEGLossless() && GetZSize() == 1) {
-
- int ln; // Position on begining of Jpeg Pixels
- fseek(fp,4,SEEK_CUR); // skipping (fffe,e000) : Basic Offset Table Item
- fread(&ln,4,1,fp);
- if(GetSwapCode())
- ln=SwapLong(ln); // Item length
- fseek(fp,ln,SEEK_CUR); // skipping Basic Offset Table ('ln' bytes)
- fseek(fp,4,SEEK_CUR); // skipping (fffe,e000) : First fragment Item Tag
- fread(&ln,4,1,fp); // First fragment length (just to know)
- if(GetSwapCode())
- ln=SwapLong(ln);
-
- ClbJpeg* jpg = _IdDcmJpegRead(fp); // TODO : find a 'full' one.
- // (We use the LibIDO one :-(
- if(jpg == NULL) {
- CloseFile();
- return false;
- }
- int * dataJpg = jpg->DataImg;
-
- switch (nBytes) {
- case 1:
- {
- unsigned short *dest = (unsigned short *)destination;
- for (int i=0; i<taille; i++) {
- *((unsigned char *)dest+i) = *(dataJpg +i);
- }
- }
- break;
-
- case 2:
- {
- unsigned short *dest = (unsigned short *)destination;
- for (int i=0; i<taille; i++) {
- *((unsigned short *)dest+i) = *(dataJpg +i);
- }
- }
- break;
- }
- _IdDcmJpegFree (jpg);
- return true;
- }
-
- // ------------------------------- JPEG Lossy : call to IJG 6b
-
- long fragmentBegining; // for ftell, fseek
-
- bool a=0, b=0;
-
- a = gdcmHeader::IsRLELossLessTransferSyntax();
- if (!a)
- 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 (a)
- res = (bool)gdcm_read_RLE_file (destination); // Reading Fragment pixels
- else 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;
- //cout << "destination" << destination << "\n";
- }
-
- return res;
-}
+ // now, it's an RGB image
+ // Lets's write it in the Header
+
+ // CreateOrReplaceIfExist ?
+
+ std::string spp = "3"; // Samples Per Pixel
+ Header->SetEntryByNumber(spp,0x0028,0x0002);
+ std::string rgb= "RGB "; // Photometric Interpretation
+ Header->SetEntryByNumber(rgb,0x0028,0x0004);
+ std::string planConfig = "0"; // Planar Configuration
+ Header->SetEntryByNumber(planConfig,0x0028,0x0006);
+
+ } else {
+ // need to make RGB Pixels (?)
+ // from grey Pixels (?!)
+ // and Gray Lut (!?!)
+ // or Segmented xxx Palette Color Lookup Table Data and so on
+
+ // Oops! I get one (gdcm-US-ALOKA-16.dcm)
+ // No idea how to manage such an image
+ // It seems that *no Dicom Viewer* has any idea :-(
+ // Segmented xxx Palette Color are *more* than 65535 long ?!?
+
+ std::string rgb= "MONOCHROME1 "; // Photometric Interpretation
+ Header->SetEntryByNumber(rgb,0x0028,0x0004);
+ }
+ /// \todo Drop Palette Color out of the Header?
+ return lgrTotale;
+}