From fe180328806c1528b6d7a8518780569c866dff40 Mon Sep 17 00:00:00 2001 From: jpr Date: Mon, 5 May 2003 07:58:14 +0000 Subject: [PATCH] Modif prise en compte jpeg lossless --- Testing/TestChangeHeader.cxx | 27 +++++++++++++---- src/gdcmFile.cxx | 56 ++++++++++++++++++++++++++++++------ src/gdcmHeader.cxx | 1 + src/gdcmHeader.h | 5 ++-- src/gdcmJpeg.cxx | 34 ++++++++++++++++------ 5 files changed, 98 insertions(+), 25 deletions(-) diff --git a/Testing/TestChangeHeader.cxx b/Testing/TestChangeHeader.cxx index fe435433..76426048 100644 --- a/Testing/TestChangeHeader.cxx +++ b/Testing/TestChangeHeader.cxx @@ -2,6 +2,7 @@ //#include "gdcm.h" #include "gdcmHeader.h" #include "gdcmFile.h" +#include // ecriture d'un fichier DICOM à partir d'un dcmHeader correct. @@ -33,30 +34,46 @@ int main(int argc, char* argv[]) // On suppose que les champs DICOM du 2ieme fichier existent *effectivement* - f1->ReplaceOrCreateByNumber( f2->GetPubElValByNumber(0x0028, 0x0008), - 0x0028, 0x0008);// nb Frames + string nbFrames = f2->GetPubElValByNumber(0x0028, 0x0008); + if(nbFrames != "gdcm::Unfound") { + f1->ReplaceOrCreateByNumber( nbFrames, 0x0028, 0x0008); + } + f1->ReplaceOrCreateByNumber( f2->GetPubElValByNumber(0x0028, 0x0010), 0x0028, 0x0010);// nbLig f1->ReplaceOrCreateByNumber( f2->GetPubElValByNumber(0x0028, 0x0011), 0x0028, 0x0011);// nbCol + // sans doute d'autres à mettre à jour... + // TODO : rajouter une valeur par defaut. // TODO : une routine qui recoit une liste de couples (gr,el), et qui fasse le boulot. dataSize = f2->GetImageDataSize(); printf ("dataSize %d\n",dataSize); imageData= f2->GetImageData(); - + f1->SetImageData(imageData,dataSize); // ou, plus joli: - //f1->SetImageData(f2->GetImageData(),f2->GetImageDataSize()); + //f1->SetImageData(f2->GetImageData(),f2->GetImageDataSize()); + + string s0 =f2->GetPubElValByNumber(0x7fe0, 0x0000); + string s10=f2->GetPubElValByNumber(0x7fe0, 0x0010); + printf("lgr 7fe0, 0000 %s\n",s0.c_str()); + printf("lgr 7fe0, 0010 %s\n",s10.c_str()); + + f1->ReplaceOrCreateByNumber( f2->GetPubElValByNumber(0x7fe0, 0x0000), + 0x7fe0, 0x0000); + //f1->ReplaceOrCreateByNumber( f2->GetPubElValByNumber(0x7fe0, 0x0010), + // 0x7fe0, 0x0010); sprintf(resultat, "%s.vol", deuxieme.c_str()); printf ("WriteDCM\n"); - f1->WriteDcmImplVR(resultat); + //f1->WriteDcmImplVR(resultat); + f1->WriteAcr(resultat); } diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index 5e39b701..6c791419 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -80,21 +80,59 @@ size_t gdcmFile::GetImageDataSize(void) { bool gdcmFile::ReadPixelData(void* destination) { if ( !OpenFile()) return false; - if ( fseek(fp, GetPixelOffset(), SEEK_SET) == -1 ) { + + if ( fseek(fp, GetPixelOffset(), SEEK_SET) == -1 ) { CloseFile(); return false; + } + + if ( !IsDicomV3() || + IsImplicitVRLittleEndianTransferSyntax() || + IsExplicitVRLittleEndianTransferSyntax() || + IsExplicitVRBigEndianTransferSyntax() || + IsDeflatedExplicitVRLittleEndianTransferSyntax() ) { + + size_t ItemRead = fread(destination, lgrTotale, 1, fp); + if ( ItemRead != 1 ) { + CloseFile(); + return false; + } else { + CloseFile(); + return true; + } } + if (IsJPEGLossless()) { - destination = _IdDcmJpegRead(fp); - } else { - size_t ItemRead = fread(destination, lgrTotale, 1, fp); - if ( ItemRead != 1 ) { + int ln; + fseek(fp,4,SEEK_CUR); + fread(&ln,4,1,fp); + if(GetSwapCode()) + ln=SwapLong(ln); + //if (DEBUG) + printf ("ln %d\n",ln); + fseek(fp,ln,SEEK_CUR); + fseek(fp,4,SEEK_CUR); + fread(&ln,4,1,fp); + if(GetSwapCode()) + ln=SwapLong(ln); + //if (DEBUG) + printf ("ln image comprimée %d\n",ln); + + ClbJpeg* jpg = _IdDcmJpegRead(fp); + if(jpg == NULL) { CloseFile(); return false; - } - } - CloseFile(); - return true; + } + memcpy(destination,jpg->DataImg,lgrTotale); + _IdDcmJpegFree (jpg); + CloseFile(); + return true; + } + + printf ("Sorry, TransfertSyntax not yet taken into account ...\n"); + CloseFile(); + return false; + } ///////////////////////////////////////////////////////////////// diff --git a/src/gdcmHeader.cxx b/src/gdcmHeader.cxx index 52e340cb..a8c62405 100644 --- a/src/gdcmHeader.cxx +++ b/src/gdcmHeader.cxx @@ -428,6 +428,7 @@ bool gdcmHeader::IsJPEGLossless(void) { return false; LoadElementValueSafe(Element); const char * Transfert = Element->GetValue().c_str(); + printf("TransfertSyntx %s\n",Transfert); if ( memcmp(Transfert+strlen(Transfert)-2 ,"70",2)==0) return true; if ( memcmp(Transfert+strlen(Transfert)-2 ,"55",2)==0) return true; return false; diff --git a/src/gdcmHeader.h b/src/gdcmHeader.h index b5505671..2fc8e8c4 100644 --- a/src/gdcmHeader.h +++ b/src/gdcmHeader.h @@ -71,8 +71,6 @@ private: guint16 ReadInt16(void); guint32 ReadInt32(void); - guint16 SwapShort(guint16); - guint32 SwapLong(guint32); guint32 FindLengthOB(void); void Initialise(void); void CheckSwap(void); @@ -100,6 +98,9 @@ private: protected: FILE * fp; FileType filetype; + + guint16 SwapShort(guint16); // needed by gdcmFile + guint32 SwapLong(guint32); // for JPEG Files :-( bool OpenFile(bool exception_on_error = false) throw(gdcmFileError); bool CloseFile(void); diff --git a/src/gdcmJpeg.cxx b/src/gdcmJpeg.cxx index 120656ed..e2b42ab8 100644 --- a/src/gdcmJpeg.cxx +++ b/src/gdcmJpeg.cxx @@ -23,11 +23,15 @@ void _IdDcmJpegFree(ClbJpeg *jpg) ClbJpeg * _IdDcmJpegRead (FILE * fp){ ClbJpeg * jpg=NULL; jpg=ClbJpegAlloc(); - if(!jpg) - return(NULL); + if(!jpg) { + printf("Fail to ClbJpegAlloc \n"); + return(NULL); + } ClbJpegInit (jpg); - if(!ClbJpegStart(jpg, fp)) - return (NULL); + if(!ClbJpegStart(jpg, fp)) { + printf("Fail to ClbJpegStart \n"); + return (NULL); + } return (jpg); } @@ -129,9 +133,15 @@ static BOOL ClbJpegFillHuffTable(ClbJpeg *jpg) static BOOL ClbJpegStart(ClbJpeg *jpg, FILE *inputfp) { jpg->infp=inputfp; - if (!ClbJpegReadHeader(jpg)) return 0; + if (!ClbJpegReadHeader(jpg)) { + printf("Fail to ClbJpegReadHeader\n"); + return 0; + } //printf("sortie ClbJpegReadHeader\n"); - if (!ClbJpegDecodeData(jpg)) return 0; + if (!ClbJpegDecodeData(jpg)) { + printf("Fail to ClbJpegDecodeData\n"); + return 0; + } //printf("sortie ClbJpegDecodeData\n"); return 1; } @@ -155,7 +165,10 @@ static BOOL ClbJpegReadHeader(ClbJpeg *jpg) while(!HeaderEnd) { gr=fgetc(jpg->infp); - if(gr!=0xFF) return 0; + if(gr!=0xFF) { + printf("gr!=0xFF (=%02x)\n",gr); + return 0; + } el=fgetc(jpg->infp); if ( (el==0xFF) || (el==0x01) || (el==0xD8) ||(el==0xD9) ||( (el>=0xD0) && (el<=0xD7) )) @@ -179,7 +192,7 @@ static BOOL ClbJpegReadHeader(ClbJpeg *jpg) l2=fgetc(jpg->infp); jpg->lSof.Wimg=(l1*256)+l2; - jpg->lSof.NbComponent=fgetc(jpg->infp); + jpg->lSof.NbComponent=fgetc(jpg->infp); jpg->lSof.SofTabPos=ftell(jpg->infp); @@ -215,7 +228,10 @@ static BOOL ClbJpegReadHeader(ClbJpeg *jpg) } } - if (!isLossLess) return 0; + if (!isLossLess) { + printf("NOT isLossLess\n"); + return 0; + } return 1; } -- 2.48.1