00001
00002
00003
00004 #ifdef _MSC_VER
00005
00006
00007
00008
00009 #pragma warning ( disable : 4251 )
00010
00011
00012 #pragma warning ( disable : 4786 )
00013 #endif //_MSC_VER
00014
00015 #include "gdcmFile.h"
00016 #include "gdcmUtil.h"
00017
00018 #define str2num(str, typeNum) *((typeNum *)(str))
00019
00020
00030 bool gdcmFile::ParsePixelData(void) {
00031
00032
00033 FILE *fp;
00034
00035 if ( !(fp=Header->OpenFile()))
00036 return false;
00037
00038 if ( fseek(fp, Header->GetPixelOffset(), SEEK_SET) == -1 ) {
00039 Header->CloseFile();
00040 return false;
00041 }
00042
00043 if ( !Header->IsDicomV3() ||
00044 Header->IsImplicitVRLittleEndianTransferSyntax() ||
00045 Header->IsExplicitVRLittleEndianTransferSyntax() ||
00046 Header->IsExplicitVRBigEndianTransferSyntax() ||
00047 Header->IsDeflatedExplicitVRLittleEndianTransferSyntax() ) {
00048
00049 printf ("gdcmFile::ParsePixelData : non JPEG/RLE File\n");
00050 return false;
00051 }
00052
00053 int nb;
00054 std::string str_nb=Header->GetEntryByNumber(0x0028,0x0100);
00055 if (str_nb == GDCM_UNFOUND ) {
00056 nb = 16;
00057 } else {
00058 nb = atoi(str_nb.c_str() );
00059 if (nb == 12) nb =16;
00060 }
00061 int nBytes= nb/8;
00062
00063 int taille = Header->GetXSize() * Header->GetYSize() * Header->GetSamplesPerPixel();
00064
00065 printf ("Checking the Dicom-encapsulated Jpeg/RLE Pixels\n");
00066
00067 guint16 ItemTagGr,ItemTagEl;
00068 int ln;
00069 long ftellRes;
00070 char * destination = NULL;
00071
00072
00073
00074 if( !Header->IsRLELossLessTransferSyntax()) {
00075
00076
00077 ftellRes=ftell(fp);
00078 fread(&ItemTagGr,2,1,fp);
00079 fread(&ItemTagEl,2,1,fp);
00080 if(Header->GetSwapCode()) {
00081 ItemTagGr=Header->SwapShort(ItemTagGr);
00082 ItemTagEl=Header->SwapShort(ItemTagEl);
00083 }
00084 printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
00085 ftellRes,ItemTagGr,ItemTagEl );
00086 ftellRes=ftell(fp);
00087 fread(&ln,4,1,fp);
00088 if(Header->GetSwapCode())
00089 ln=Header->SwapLong(ln);
00090 printf("at %x : Basic Offset Table Item Length (??) %d x(%08x)\n",
00091 ftellRes,ln,ln);
00092 if (ln != 0) {
00093
00094 char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
00095 fread(BasicOffsetTableItemValue,ln,1,fp);
00096 guint32 a;
00097 for (int i=0;i<ln;i+=4){
00098 a=str2num(&BasicOffsetTableItemValue[i],guint32);
00099 printf(" x(%08x) %d\n",a,a);
00100 }
00101 }
00102
00103 ftellRes=ftell(fp);
00104 fread(&ItemTagGr,2,1,fp);
00105 fread(&ItemTagEl,2,1,fp);
00106 if(Header->GetSwapCode()) {
00107 ItemTagGr=Header->SwapShort(ItemTagGr);
00108 ItemTagEl=Header->SwapShort(ItemTagEl);
00109 }
00110 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
00111 ftellRes,ItemTagGr,ItemTagEl );
00112
00113 while ( ( ItemTagGr==0xfffe) && (ItemTagEl!=0xe0dd) ) {
00114
00115 ftellRes=ftell(fp);
00116 fread(&ln,4,1,fp);
00117 if(Header->GetSwapCode())
00118 ln=Header->SwapLong(ln);
00119 printf(" at %x : fragment length %d x(%08x)\n",
00120 ftellRes, ln,ln);
00121
00122
00123
00124
00125
00126
00127 fseek(fp,ln,SEEK_CUR);
00128
00129
00130 ftellRes=ftell(fp);
00131 fread(&ItemTagGr,2,1,fp);
00132 fread(&ItemTagEl,2,1,fp);
00133 if(Header->GetSwapCode()) {
00134 ItemTagGr=Header->SwapShort(ItemTagGr);
00135 ItemTagEl=Header->SwapShort(ItemTagEl);
00136 }
00137 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
00138 ftellRes,ItemTagGr,ItemTagEl );
00139 }
00140
00141 } else {
00142
00143
00144 long RleSegmentLength[15],fragmentLength;
00145 guint32 nbRleSegments;
00146 guint32 RleSegmentOffsetTable[15];
00147 ftellRes=ftell(fp);
00148
00149
00150 fread(&ItemTagGr,2,1,fp);
00151 fread(&ItemTagEl,2,1,fp);
00152 if(Header->GetSwapCode()) {
00153 ItemTagGr=Header->SwapShort(ItemTagGr);
00154 ItemTagEl=Header->SwapShort(ItemTagEl);
00155 }
00156 printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
00157 ftellRes,ItemTagGr,ItemTagEl );
00158
00159 ftellRes=ftell(fp);
00160 fread(&ln,4,1,fp);
00161 if(Header->GetSwapCode())
00162 ln=Header->SwapLong(ln);
00163 printf("at %x : Basic Offset Table Item Length (??) %d x(%08x)\n",
00164 ftellRes,ln,ln);
00165 if (ln != 0) {
00166
00167 char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
00168 fread(BasicOffsetTableItemValue,ln,1,fp);
00169 guint32 a;
00170 for (int i=0;i<ln;i+=4){
00171 a=str2num(&BasicOffsetTableItemValue[i],guint32);
00172 printf(" x(%08x) %d\n",a,a);
00173 }
00174 }
00175
00176 ftellRes=ftell(fp);
00177 fread(&ItemTagGr,2,1,fp);
00178 fread(&ItemTagEl,2,1,fp);
00179 if(Header->GetSwapCode()) {
00180 ItemTagGr=Header->SwapShort(ItemTagGr);
00181 ItemTagEl=Header->SwapShort(ItemTagEl);
00182 }
00183 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
00184 ftellRes,ItemTagGr,ItemTagEl );
00185
00186
00187 while ( ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) {
00188
00189 ftellRes=ftell(fp);
00190 fread(&fragmentLength,4,1,fp);
00191 if(Header->GetSwapCode())
00192 fragmentLength=Header->SwapLong(fragmentLength);
00193 printf(" at %x : 'fragment' length %d x(%08x)\n",
00194 ftellRes, fragmentLength,fragmentLength);
00195
00196
00197
00198 fread(&nbRleSegments,4,1,fp);
00199 if(Header->GetSwapCode())
00200 nbRleSegments=Header->SwapLong(nbRleSegments);
00201 printf(" Nb of RLE Segments : %d\n",nbRleSegments);
00202
00203 for(int k=1; k<=15; k++) {
00204 ftellRes=ftell(fp);
00205 fread(&RleSegmentOffsetTable[k],4,1,fp);
00206 if(Header->GetSwapCode())
00207 RleSegmentOffsetTable[k]=Header->SwapLong(RleSegmentOffsetTable[k]);
00208 printf(" at : %x Offset Segment %d : %d (%x)\n",
00209 ftellRes,k,RleSegmentOffsetTable[k],
00210 RleSegmentOffsetTable[k]);
00211 }
00212
00213 if (nbRleSegments>1) {
00214 for(int k=1; k<=nbRleSegments-1; k++) {
00215 RleSegmentLength[k]= RleSegmentOffsetTable[k+1]
00216 - RleSegmentOffsetTable[k];
00217 ftellRes=ftell(fp);
00218 printf (" Segment %d : Length = %d x(%x) Start at %x\n",
00219 k,RleSegmentLength[k],RleSegmentLength[k], ftellRes);
00220 fseek(fp,RleSegmentLength[k],SEEK_CUR);
00221 }
00222 }
00223 RleSegmentLength[nbRleSegments]= fragmentLength
00224 - RleSegmentOffsetTable[nbRleSegments];
00225 ftellRes=ftell(fp);
00226 printf (" Segment %d : Length = %d x(%x) Start at %x\n",
00227 nbRleSegments,RleSegmentLength[nbRleSegments],
00228 RleSegmentLength[nbRleSegments],ftellRes);
00229
00230 fseek(fp,RleSegmentLength[nbRleSegments],SEEK_CUR);
00231
00232
00233
00234 ftellRes=ftell(fp);
00235 fread(&ItemTagGr,2,1,fp);
00236 fread(&ItemTagEl,2,1,fp);
00237 if(Header->GetSwapCode()) {
00238 ItemTagGr=Header->SwapShort(ItemTagGr);
00239 ItemTagEl=Header->SwapShort(ItemTagEl);
00240 }
00241 printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
00242 ftellRes,ItemTagGr,ItemTagEl );
00243 }
00244 }
00245 return true;
00246 }
00247
00248