- cout << "JPEG image" << endl;
- ftellRes=ftell(fp);
- fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Basic Offset Table Item Tag Gr
- fread(&ItemTagEl,2,1,fp); // Reading (e000) : Basic Offset Table Item Tag El
- if(GetSwapCode()) {
- ItemTagGr=SwapShort(ItemTagGr);
- ItemTagEl=SwapShort(ItemTagEl);
- }
- printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
- ftellRes,ItemTagGr,ItemTagEl );
- ftellRes=ftell(fp);
- fread(&ln,4,1,fp);
- if(GetSwapCode())
- ln=SwapLong(ln); // Basic Offset Table Item Lentgh
- printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n",
- ftellRes,ln,ln);
- if (ln != 0) {
- // What is it used for ??
- char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
- fread(BasicOffsetTableItemValue,ln,1,fp);
- guint32 a;
- for (int i=0;i<ln;i+=4){
- a=str2num(&BasicOffsetTableItemValue[i],guint32);
- printf(" x(%08x) %d\n",a,a);
- }
- }
-
- ftellRes=ftell(fp);
- 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);
- }
- printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
- ftellRes,ItemTagGr,ItemTagEl );
-
- while ( ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) { // Parse fragments
-
- ftellRes=ftell(fp);
- fread(&ln,4,1,fp);
- if(GetSwapCode())
- ln=SwapLong(ln); // length
- printf(" at %x : fragment length %d x(%08x)\n",
- ftellRes, ln,ln);
-
- // destination += taille * nBytes; // location in user's memory
- //printf (" Destination will be x(%x) = %d \n",
- // destination,destination );
-
- // ------------------------
- fseek(fp,ln,SEEK_CUR); // skipping (not reading) fragment pixels
- // ------------------------
-
- ftellRes=ftell(fp);
- 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);
- }
- printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
- ftellRes,ItemTagGr,ItemTagEl );
- }
-
- } else {
-
- // RLE Image
-
- cout << "RLE image" << endl;
- long RleSegmentLength[15],fragmentLength;
- guint32 nbRleSegments;
- guint32 RleSegmentOffsetTable[15];
- ftellRes=ftell(fp);
- // Basic Offset Table with Item Value
- // Item Tag
- fread(&ItemTagGr,2,1,fp); // Reading (fffe):Basic Offset Table Item Tag Gr
- fread(&ItemTagEl,2,1,fp); // Reading (e000):Basic Offset Table Item Tag El
- if(GetSwapCode()) {
- ItemTagGr=SwapShort(ItemTagGr);
- ItemTagEl=SwapShort(ItemTagEl);
- }
- printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
- ftellRes,ItemTagGr,ItemTagEl );
- // Item Length
- ftellRes=ftell(fp);
- fread(&ln,4,1,fp);
- if(GetSwapCode())
- ln=SwapLong(ln); // Basic Offset Table Item Lentgh
- printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n",
- ftellRes,ln,ln);
- if (ln != 0) {
- // What is it used for ??
- char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
- fread(BasicOffsetTableItemValue,ln,1,fp);
- guint32 a;
- for (int i=0;i<ln;i+=4){
- a=str2num(&BasicOffsetTableItemValue[i],guint32);
- printf(" x(%08x) %d\n",a,a);
- }
- }
+/**
+ * \brief computes the length (in bytes) we must ALLOCATE to receive the
+ * image(s) pixels (multiframes taken into account)
+ * \warning : it is NOT the group 7FE0 length
+ * (no interest for compressed images).
+ */
+int File::ComputeDecompressedPixelDataSizeFromHeader()
+{
+ // see PS 3.3-2003 : C.7.6.3.2.1
+ //
+ // MONOCHROME1
+ // MONOCHROME2
+ // PALETTE COLOR
+ // RGB
+ // HSV (Retired)
+ // ARGB (Retired)
+ // CMYK (Retired)
+ // YBR_FULL
+ // YBR_FULL_422 (no LUT, no Palette)
+ // YBR_PARTIAL_422
+ // YBR_ICT
+ // YBR_RCT
+
+ // LUT's
+ // ex : gdcm-US-ALOKA-16.dcm
+ // 0028|1221 [OW] [Segmented Red Palette Color Lookup Table Data]
+ // 0028|1222 [OW] [Segmented Green Palette Color Lookup Table Data]
+ // 0028|1223 [OW] [Segmented Blue Palette Color Lookup Table Data]
+
+ // ex : OT-PAL-8-face.dcm
+ // 0028|1201 [US] [Red Palette Color Lookup Table Data]
+ // 0028|1202 [US] [Green Palette Color Lookup Table Data]
+ // 0028|1203 [US] [Blue Palette Color Lookup Table Data]
+
+ int numberBitsAllocated = HeaderInternal->GetBitsAllocated();
+ // Number of "Bits Allocated" is fixed to 16 when:
+ // - it is not defined (i.e. it's value is 0)
+ // - it's 12, since we will expand the image to 16 bits (see
+ // PixelConvert::ConvertDecompress12BitsTo16Bits() )
+ if ( numberBitsAllocated == 0 || numberBitsAllocated == 12 )
+ {
+ numberBitsAllocated = 16;
+ }