From 3b6165f247797ef596515fbd31d71151a0cfe059 Mon Sep 17 00:00:00 2001 From: jpr Date: Tue, 14 Oct 2003 11:53:16 +0000 Subject: [PATCH] --> Some supposed-to-be Dicom Images have no preamble. OpenFile takes it into account --> Jpeg LossLess 24 Bits images doesn-t break any longer gdcm --- src/gdcmFile.cxx | 2 +- src/gdcmHeader.cxx | 6 +++--- src/gdcmJpegIdo.cxx | 26 +++++++++++++++----------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index 20178169..3c1f8efb 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -180,7 +180,7 @@ bool gdcmFile::ReadPixelData(void* destination) { return false; } int * dataJpg = jpg->DataImg; - + switch (nBytes) { case 1: { diff --git a/src/gdcmHeader.cxx b/src/gdcmHeader.cxx index 5657dd2c..43f6f549 100644 --- a/src/gdcmHeader.cxx +++ b/src/gdcmHeader.cxx @@ -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); diff --git a/src/gdcmJpegIdo.cxx b/src/gdcmJpegIdo.cxx index 650c362f..6a4d2575 100644 --- a/src/gdcmJpegIdo.cxx +++ b/src/gdcmJpegIdo.cxx @@ -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;iXlSof.Wimg;iX++) // lit première ligne + for(iX=0;iXlSof.NbComponent;iX++) // lit première ligne // *3 { lbInc+=1; if (lbInc>1) @@ -277,8 +281,8 @@ static BOOL ClbJpegDecodeData(ClbJpeg *jpg) for (iY=1;iYlSof.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;iXlSof.Wimg;iX++) + for(iX=1;iXlSof.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]; } -- 2.48.1