3 //This is needed when compiling in debug mode
5 // 'type' : forcing value to bool 'true' or 'false' (performance warning)
6 //#pragma warning ( disable : 4800 )
7 // 'identifier' : class 'type' needs to have dll-interface to be used by
8 // clients of class 'type2'
9 #pragma warning ( disable : 4251 )
10 // 'identifier' : identifier was truncated to 'number' characters in the
12 #pragma warning ( disable : 4786 )
18 #define str2num(str, typeNum) *((typeNum *)(str))
20 /////////////////////////////////////////////////////////////////
23 * \brief Parse pixel data from disk and *prints* the result
24 * \ For multi-fragment Jpeg/Rle files checking purpose *only*
25 * \ Allows to 'see' if the file *does* conform
26 * \ (some of them do not)
27 * \ with Dicom Part 3, Annex A (PS 3.5-2003, page 58, page 85)
30 bool gdcmFile::ParsePixelData(void) {
32 // DO NOT remove the printf s.
33 // The ONLY purpose of this methos is to PRINT the content
37 if ( !(fp=Header->OpenFile()))
40 if ( fseek(fp, Header->GetPixelOffset(), SEEK_SET) == -1 ) {
45 if ( !Header->IsDicomV3() ||
46 Header->IsImplicitVRLittleEndianTransferSyntax() ||
47 Header->IsExplicitVRLittleEndianTransferSyntax() ||
48 Header->IsExplicitVRBigEndianTransferSyntax() ||
49 Header->IsDeflatedExplicitVRLittleEndianTransferSyntax() ) {
51 printf ("gdcmFile::ParsePixelData : non JPEG/RLE File\n");
56 std::string str_nb=Header->GetPubElValByNumber(0x0028,0x0100);
57 if (str_nb == GDCM_UNFOUND ) {
60 nb = atoi(str_nb.c_str() );
65 int taille = Header->GetXSize() * Header->GetYSize() * Header->GetSamplesPerPixel();
67 printf ("Checking the Dicom-encapsulated Jpeg/RLE Pixels\n");
69 guint16 ItemTagGr,ItemTagEl;
72 char * destination = NULL;
74 // -------------------- for Parsing : Position on begining of Jpeg/RLE Pixels
76 if( !Header->IsRLELossLessTransferSyntax()) {
80 fread(&ItemTagGr,2,1,fp); //Reading (fffe):Basic Offset Table Item Tag Gr
81 fread(&ItemTagEl,2,1,fp); //Reading (e000):Basic Offset Table Item Tag El
82 if(Header->GetSwapCode()) {
83 ItemTagGr=Header->SwapShort(ItemTagGr);
84 ItemTagEl=Header->SwapShort(ItemTagEl);
86 printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
87 ftellRes,ItemTagGr,ItemTagEl );
90 if(Header->GetSwapCode())
91 ln=Header->SwapLong(ln); // Basic Offset Table Item Lentgh
92 printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n",
95 // What is it used for ??
96 char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
97 fread(BasicOffsetTableItemValue,ln,1,fp);
99 for (int i=0;i<ln;i+=4){
100 a=str2num(&BasicOffsetTableItemValue[i],guint32);
101 printf(" x(%08x) %d\n",a,a);
106 fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
107 fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
108 if(Header->GetSwapCode()) {
109 ItemTagGr=Header->SwapShort(ItemTagGr);
110 ItemTagEl=Header->SwapShort(ItemTagEl);
112 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
113 ftellRes,ItemTagGr,ItemTagEl );
115 while ( ( ItemTagGr==0xfffe) && (ItemTagEl!=0xe0dd) ) { // Parse fragments
119 if(Header->GetSwapCode())
120 ln=Header->SwapLong(ln); // length
121 printf(" at %x : fragment length %d x(%08x)\n",
124 // destination += taille * nBytes; // location in user's memory
125 //printf (" Destination will be x(%x) = %d \n",
126 // destination,destination );
128 // ------------------------
129 fseek(fp,ln,SEEK_CUR); // skipping (not reading) fragment pixels
130 // ------------------------
133 fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
134 fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
135 if(Header->GetSwapCode()) {
136 ItemTagGr=Header->SwapShort(ItemTagGr);
137 ItemTagEl=Header->SwapShort(ItemTagEl);
139 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
140 ftellRes,ItemTagGr,ItemTagEl );
146 long RleSegmentLength[15],fragmentLength;
147 guint32 nbRleSegments;
148 guint32 RleSegmentOffsetTable[15];
150 // Basic Offset Table with Item Value
152 fread(&ItemTagGr,2,1,fp); //Reading (fffe):Basic Offset Table Item Tag Gr
153 fread(&ItemTagEl,2,1,fp); //Reading (e000):Basic Offset Table Item Tag El
154 if(Header->GetSwapCode()) {
155 ItemTagGr=Header->SwapShort(ItemTagGr);
156 ItemTagEl=Header->SwapShort(ItemTagEl);
158 printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
159 ftellRes,ItemTagGr,ItemTagEl );
163 if(Header->GetSwapCode())
164 ln=Header->SwapLong(ln); // Basic Offset Table Item Lentgh
165 printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n",
168 // What is it used for ??
169 char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
170 fread(BasicOffsetTableItemValue,ln,1,fp);
172 for (int i=0;i<ln;i+=4){
173 a=str2num(&BasicOffsetTableItemValue[i],guint32);
174 printf(" x(%08x) %d\n",a,a);
179 fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
180 fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
181 if(Header->GetSwapCode()) {
182 ItemTagGr=Header->SwapShort(ItemTagGr);
183 ItemTagEl=Header->SwapShort(ItemTagEl);
185 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
186 ftellRes,ItemTagGr,ItemTagEl );
188 // while 'Sequence Delimiter Item' (fffe,e0dd) not found
189 while ( ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) {
190 // Parse fragments of the current Fragment (Frame)
192 fread(&fragmentLength,4,1,fp);
193 if(Header->GetSwapCode())
194 fragmentLength=Header->SwapLong(fragmentLength); // length
195 printf(" at %x : 'fragment' length %d x(%08x)\n",
196 ftellRes, fragmentLength,fragmentLength);
198 //------------------ scanning (not reading) fragment pixels
200 fread(&nbRleSegments,4,1,fp); // Reading : Number of RLE Segments
201 if(Header->GetSwapCode())
202 nbRleSegments=Header->SwapLong(nbRleSegments);
203 printf(" Nb of RLE Segments : %d\n",nbRleSegments);
205 for(int k=1; k<=15; k++) { // Reading RLE Segments Offset Table
207 fread(&RleSegmentOffsetTable[k],4,1,fp);
208 if(Header->GetSwapCode())
209 RleSegmentOffsetTable[k]=Header->SwapLong(RleSegmentOffsetTable[k]);
210 printf(" at : %x Offset Segment %d : %d (%x)\n",
211 ftellRes,k,RleSegmentOffsetTable[k],
212 RleSegmentOffsetTable[k]);
215 if (nbRleSegments>1) { // skipping (not reading) RLE Segments
216 for(int k=1; k<=nbRleSegments-1; k++) {
217 RleSegmentLength[k]= RleSegmentOffsetTable[k+1]
218 - RleSegmentOffsetTable[k];
220 printf (" Segment %d : Length = %d x(%x) Start at %x\n",
221 k,RleSegmentLength[k],RleSegmentLength[k], ftellRes);
222 fseek(fp,RleSegmentLength[k],SEEK_CUR);
225 RleSegmentLength[nbRleSegments]= fragmentLength
226 - RleSegmentOffsetTable[nbRleSegments];
228 printf (" Segment %d : Length = %d x(%x) Start at %x\n",
229 nbRleSegments,RleSegmentLength[nbRleSegments],
230 RleSegmentLength[nbRleSegments],ftellRes);
232 fseek(fp,RleSegmentLength[nbRleSegments],SEEK_CUR);
234 // ------------------ end of scanning fragment pixels
237 fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
238 fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
239 if(Header->GetSwapCode()) {
240 ItemTagGr=Header->SwapShort(ItemTagGr);
241 ItemTagEl=Header->SwapShort(ItemTagEl);
243 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
244 ftellRes,ItemTagGr,ItemTagEl );