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) {
35 if ( fseek(fp, GetPixelOffset(), SEEK_SET) == -1 ) {
41 IsImplicitVRLittleEndianTransferSyntax() ||
42 IsExplicitVRLittleEndianTransferSyntax() ||
43 IsExplicitVRBigEndianTransferSyntax() ||
44 IsDeflatedExplicitVRLittleEndianTransferSyntax() ) {
46 printf ("gdcmFile::ParsePixelData : non JPEG/RLE File\n");
51 std::string str_nb=gdcmHeader::GetPubElValByNumber(0x0028,0x0100);
52 if (str_nb == GDCM_UNFOUND ) {
55 nb = atoi(str_nb.c_str() );
60 int taille = GetXSize() * GetYSize() * GetSamplesPerPixel();
62 printf ("Checking the Dicom-encapsulated Jpeg/RLE Pixels\n");
64 guint16 ItemTagGr,ItemTagEl;
67 char * destination = NULL;
69 // -------------------- for Parsing : Position on begining of Jpeg/RLE Pixels
71 if( !IsRLELossLessTransferSyntax()) {
75 std::cout << "JPEG image" << std::endl;
77 fread(&ItemTagGr,2,1,fp); //Reading (fffe):Basic Offset Table Item Tag Gr
78 fread(&ItemTagEl,2,1,fp); //Reading (e000):Basic Offset Table Item Tag El
80 ItemTagGr=SwapShort(ItemTagGr);
81 ItemTagEl=SwapShort(ItemTagEl);
83 printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
84 ftellRes,ItemTagGr,ItemTagEl );
88 ln=SwapLong(ln); // Basic Offset Table Item Lentgh
89 printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n",
92 // What is it used for ??
93 char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
94 fread(BasicOffsetTableItemValue,ln,1,fp);
96 for (int i=0;i<ln;i+=4){
97 a=str2num(&BasicOffsetTableItemValue[i],guint32);
98 printf(" x(%08x) %d\n",a,a);
103 fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
104 fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
106 ItemTagGr=SwapShort(ItemTagGr);
107 ItemTagEl=SwapShort(ItemTagEl);
109 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
110 ftellRes,ItemTagGr,ItemTagEl );
112 while ( ( ItemTagGr==0xfffe) && (ItemTagEl!=0xe0dd) ) { // Parse fragments
117 ln=SwapLong(ln); // length
118 printf(" at %x : fragment length %d x(%08x)\n",
121 // destination += taille * nBytes; // location in user's memory
122 //printf (" Destination will be x(%x) = %d \n",
123 // destination,destination );
125 // ------------------------
126 fseek(fp,ln,SEEK_CUR); // skipping (not reading) fragment pixels
127 // ------------------------
130 fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
131 fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
133 ItemTagGr=SwapShort(ItemTagGr);
134 ItemTagEl=SwapShort(ItemTagEl);
136 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
137 ftellRes,ItemTagGr,ItemTagEl );
144 std::cout << "RLE image" << std::endl;
145 long RleSegmentLength[15],fragmentLength;
146 guint32 nbRleSegments;
147 guint32 RleSegmentOffsetTable[15];
149 // Basic Offset Table with Item Value
151 fread(&ItemTagGr,2,1,fp); //Reading (fffe):Basic Offset Table Item Tag Gr
152 fread(&ItemTagEl,2,1,fp); //Reading (e000):Basic Offset Table Item Tag El
154 ItemTagGr=SwapShort(ItemTagGr);
155 ItemTagEl=SwapShort(ItemTagEl);
157 printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
158 ftellRes,ItemTagGr,ItemTagEl );
163 ln=SwapLong(ln); // Basic Offset Table Item Lentgh
164 printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n",
167 // What is it used for ??
168 char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
169 fread(BasicOffsetTableItemValue,ln,1,fp);
171 for (int i=0;i<ln;i+=4){
172 a=str2num(&BasicOffsetTableItemValue[i],guint32);
173 printf(" x(%08x) %d\n",a,a);
178 fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
179 fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
181 ItemTagGr=SwapShort(ItemTagGr);
182 ItemTagEl=SwapShort(ItemTagEl);
184 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
185 ftellRes,ItemTagGr,ItemTagEl );
187 // while 'Sequence Delimiter Item' (fffe,e0dd) not found
188 while ( ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) {
189 // Parse fragments of the current Fragment (Frame)
191 fread(&fragmentLength,4,1,fp);
193 fragmentLength=SwapLong(fragmentLength); // length
194 printf(" at %x : 'fragment' length %d x(%08x)\n",
195 ftellRes, fragmentLength,fragmentLength);
197 //------------------ scanning (not reading) fragment pixels
199 fread(&nbRleSegments,4,1,fp); // Reading : Number of RLE Segments
201 nbRleSegments=SwapLong(nbRleSegments);
202 printf(" Nb of RLE Segments : %d\n",nbRleSegments);
204 for(int k=1; k<=15; k++) { // Reading RLE Segments Offset Table
206 fread(&RleSegmentOffsetTable[k],4,1,fp);
208 RleSegmentOffsetTable[k]=SwapLong(RleSegmentOffsetTable[k]);
209 printf(" at : %x Offset Segment %d : %d (%x)\n",
210 ftellRes,k,RleSegmentOffsetTable[k],
211 RleSegmentOffsetTable[k]);
214 if (nbRleSegments>1) { // skipping (not reading) RLE Segments
215 for(int k=1; k<=nbRleSegments-1; k++) {
216 RleSegmentLength[k]= RleSegmentOffsetTable[k+1]
217 - RleSegmentOffsetTable[k];
219 printf (" Segment %d : Length = %d x(%x) Start at %x\n",
220 k,RleSegmentLength[k],RleSegmentLength[k], ftellRes);
221 fseek(fp,RleSegmentLength[k],SEEK_CUR);
224 RleSegmentLength[nbRleSegments]= fragmentLength
225 - RleSegmentOffsetTable[nbRleSegments];
227 printf (" Segment %d : Length = %d x(%x) Start at %x\n",
228 nbRleSegments,RleSegmentLength[nbRleSegments],
229 RleSegmentLength[nbRleSegments],ftellRes);
231 fseek(fp,RleSegmentLength[nbRleSegments],SEEK_CUR);
233 // ------------------ end of scanning fragment pixels
236 fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr
237 fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El
239 ItemTagGr=SwapShort(ItemTagGr);
240 ItemTagEl=SwapShort(ItemTagEl);
242 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
243 ftellRes,ItemTagGr,ItemTagEl );