]> Creatis software - gdcm.git/commitdiff
--> Some supposed-to-be Dicom Images have no preamble.
authorjpr <jpr>
Tue, 14 Oct 2003 11:53:16 +0000 (11:53 +0000)
committerjpr <jpr>
Tue, 14 Oct 2003 11:53:16 +0000 (11:53 +0000)
    OpenFile takes it into account

--> Jpeg LossLess 24 Bits images doesn-t break any longer gdcm

src/gdcmFile.cxx
src/gdcmHeader.cxx
src/gdcmJpegIdo.cxx

index 20178169cf5a1c4f5e22c963a675335375a8b785..3c1f8efb4b2a9064c3a6565a671339de0659dac7 100644 (file)
@@ -180,7 +180,7 @@ bool gdcmFile::ReadPixelData(void* destination) {
          return false;
       }      
       int * dataJpg = jpg->DataImg;
-      
       switch (nBytes) {   
          case 1:
          {
index 5657dd2c6c1344020c7286e3e40f28700f3de780..43f6f549002e6f80eb7a1a3e87b438c35c1783f8 100644 (file)
@@ -1,4 +1,4 @@
-// $Header: /cvs/public/gdcm/src/Attic/gdcmHeader.cxx,v 1.99 2003/10/10 16:54:25 jpr Exp $
+// $Header: /cvs/public/gdcm/src/Attic/gdcmHeader.cxx,v 1.100 2003/10/14 11:53:16 jpr Exp $
 
 #include "gdcmHeader.h"
 
@@ -77,8 +77,8 @@ gdcmHeader::gdcmHeader(bool exception_on_error) {
   guint16 zero;
   fread(&zero,  (size_t)2, (size_t)1, fp);
   if ( fp ) {
-    //ACR
-    if( zero == 0x0008 || zero == 0x0800 )
+    //ACR -- or DICOM with no Preamble
+    if( zero == 0x0008 || zero == 0x0800 || zero == 0x0002 || zero == 0x0200)
        return true;
     //DICOM
     fseek(fp, 126L, SEEK_CUR);
index 650c362f93833da1b5b6b8cee29c30278852c879..6a4d2575ba8ad18824eff53c9d1bf1ed073a7bab 100644 (file)
@@ -149,7 +149,7 @@ static BOOL ClbJpegReadHeader(ClbJpeg *jpg) {
       else {
          l1=fgetc(jpg->infp);
          l2=fgetc(jpg->infp);
-         sztag=(l1*256)+l2-2; //tag lengh
+         sztag=(l1*256)+l2-2; //tag length
          ouca=ftell(jpg->infp);
 
          if (el==0xC3) {
@@ -166,7 +166,9 @@ static BOOL ClbJpegReadHeader(ClbJpeg *jpg) {
             jpg->lSof.Wimg=(l1*256)+l2;
 
             //printf("%x %x Wimg %d\n",l1,l2,jpg->lSof.Wimg);
+
             jpg->lSof.NbComponent=fgetc(jpg->infp); 
+            //printf("NbComponent %d\n", jpg->lSof.NbComponent);
 
             jpg->lSof.SofTabPos=ftell(jpg->infp);
 
@@ -239,8 +241,10 @@ static BOOL ClbJpegDecodeData(ClbJpeg *jpg)
        int iX,iY;
        int lbInc=0;
        unsigned int mask; 
+        int dimX;
          
        int lPredicted=(1<<(jpg->lSof.precision-1-jpg->lSos.Sospttrans));
+        dimX=jpg->lSof.Wimg;
 
        jpg->ValCurByte=jpg->lSos.SuccessiveAp;
        jpg->PosCurBit=9;
@@ -255,13 +259,13 @@ static BOOL ClbJpegDecodeData(ClbJpeg *jpg)
 //printf("jpg->lSof.precision : %d\n",jpg->lSof.precision );
 //printf("sizeof(*jpg->DataImg) : %d\n",sizeof(*jpg->DataImg) );
 
-        jpg->DataImg=(int*)malloc(jpg->lSof.Himg*jpg->lSof.Wimg*sizeof(*jpg->DataImg));
-       memset( jpg->DataImg,0,(jpg->lSof.Himg * jpg->lSof.Wimg * sizeof(*jpg->DataImg)));
+       jpg->DataImg=(int*)malloc(jpg->lSof.Himg*dimX*sizeof(*jpg->DataImg)*jpg->lSof.NbComponent);    // *3
+       memset( jpg->DataImg,0,(jpg->lSof.Himg * dimX * sizeof(*jpg->DataImg)*jpg->lSof.NbComponent)); // *3
 
        if (!jpg->RestartInterval)
        {
        //printf("il N'y a PAS un define interval\n");
-               for(iX=0;iX<jpg->lSof.Wimg;iX++) // lit première ligne
+               for(iX=0;iX<dimX*jpg->lSof.NbComponent;iX++) // lit première ligne // *3
                {
                        lbInc+=1;
                        if (lbInc>1)
@@ -277,8 +281,8 @@ static BOOL ClbJpegDecodeData(ClbJpeg *jpg)
                for (iY=1;iY<jpg->lSof.Himg;iY++) //lit la suite
                {
                        lbInc+=1;
-                       if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg-1)) break;
-                       lPredicted= jpg->DataImg[lbInc-jpg->lSof.Wimg]; // se base % premier é ligne d'avant
+                       if (lbInc>(jpg->lSof.Himg*dimX*jpg->lSof.NbComponent-1)) break; //*3
+                       lPredicted= jpg->DataImg[lbInc-jpg->lSof.Wimg*jpg->lSof.NbComponent];//*3       // se base % premier é ligne d'avant
                         jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
 
                        if (  jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) ) 
@@ -286,12 +290,12 @@ static BOOL ClbJpegDecodeData(ClbJpeg *jpg)
                        if ( jpg->DataImg[lbInc]<0) 
                                 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
 
-                       for(iX=1;iX<jpg->lSof.Wimg;iX++)
+                       for(iX=1;iX<jpg->lSof.Wimg*jpg->lSof.NbComponent;iX++) //*3
                        {
                                lbInc+=1;
-                               if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg-1)) break;
+                               if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg*jpg->lSof.NbComponent-1)) break;//*3
                                if (jpg->lSos.SpectralSelStart==7) // si spectral
-                                       lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg])>>1;
+                                       lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg*jpg->lSof.NbComponent])>>1; //*3
                                else
                                        lPredicted= jpg->DataImg[lbInc-1];              // se base%pixel juste avant
                                 jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
@@ -321,10 +325,10 @@ static BOOL ClbJpegDecodeData(ClbJpeg *jpg)
                                         jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
 
                                lbInc+=1;
-                               if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg-1)) return 1;
+                               if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg*jpg->lSof.NbComponent-1)) return 1; //*3
 
                                if (jpg->lSos.SpectralSelStart==7) // si spectral
-                                       lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg])>>1;
+                                       lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg*jpg->lSof.NbComponent])>>1; //*3
                                else
                                        lPredicted= jpg->DataImg[lbInc-1];
                        }