X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=Example%2FTestPapyrus.cxx;h=9f99e31a26200d1f40d4b50a0e760b8437547544;hb=d00078b5e19310b379c8339fa8fe38362e8ca392;hp=893ab8cd1277d30a8dfad9df3b5de88a48592fd2;hpb=4dda77ff722a08898ae9ca75eacce0f11336cf12;p=gdcm.git diff --git a/Example/TestPapyrus.cxx b/Example/TestPapyrus.cxx index 893ab8cd..9f99e31a 100644 --- a/Example/TestPapyrus.cxx +++ b/Example/TestPapyrus.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: TestPapyrus.cxx,v $ Language: C++ - Date: $Date: 2005/01/19 17:49:42 $ - Version: $Revision: 1.1 $ + Date: $Date: 2005/01/20 16:16:58 $ + Version: $Revision: 1.4 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -16,12 +16,14 @@ =========================================================================*/ #include "gdcmHeader.h" -#include "gdcmFile.h" +#include "gdcmFileHelper.h" #include "gdcmDocument.h" #include "gdcmValEntry.h" #include "gdcmBinEntry.h" #include "gdcmSeqEntry.h" #include "gdcmSQItem.h" +#include "gdcmDebug.h" +#include "gdcmUtil.h" //#include @@ -66,20 +68,21 @@ bool RemoveFile(const char* source) // and we don't perform any integrity check // ---------------------------------------------------------------------- -// TODO : finish writing the program ! - int main(int argc, char* argv[]) { if (argc < 3) { std::cerr << "Usage :" << std::endl << - argv[0] << " input_papyrus output_dicom" << std::endl; + argv[0] << " input_papyrus output_dicom verbose" << std::endl; return 1; } std::string filename = argv[1]; std::string output = argv[2]; + if (argc > 3) + gdcm::Debug::SetDebugOn(); + if( FileExists( output.c_str() ) ) { if( !RemoveFile( output.c_str() ) ) @@ -88,7 +91,7 @@ int main(int argc, char* argv[]) return 1; } } - gdcm::File *original = new gdcm::File( filename ); + gdcm::FileHelper *original = new gdcm::FileHelper( filename ); gdcm::Header *h = original->GetHeader(); // Look for private Papyrus Sequence @@ -100,7 +103,7 @@ int main(int argc, char* argv[]) return 1; } - gdcm::SQItem *sqi = seqPapyrus->GetFirstEntry(); + gdcm::SQItem *sqi = seqPapyrus->GetFirstSQItem(); if (sqi == 0) { std::cout << "NO SQItem found within private Papyrus Sequence" @@ -108,17 +111,19 @@ int main(int argc, char* argv[]) delete h; return 1; } - -// Get informations on the file : -// Modality, Transfer Syntax, Study Date, Study Time -// Patient Name, etc std::string TransferSyntax; std::string StudyDate; std::string StudyTime; std::string Modality; std::string PatientName; + std::string MediaStSOPinstUID; + +// Get informations on the file : +// Modality, Transfer Syntax, Study Date, Study Time +// Patient Name, Media Storage SOP Instance UID, etc + MediaStSOPinstUID = h->GetEntry(0x0002,0x0002); TransferSyntax = h->GetEntry(0x0002,0x0010); StudyDate = sqi->GetEntry(0x0008,0x0020); StudyTime = sqi->GetEntry(0x0008,0x0030); @@ -134,14 +139,7 @@ int main(int argc, char* argv[]) std::string BitsStored; std::string HighBit; std::string PixelRepresentation; - - // just convert those needed to compute PixelArea length - int iRows = (uint32_t) atoi( Rows.c_str() ); - int iColumns = (uint32_t) atoi( Columns.c_str() ); - int iSamplesPerPixel = (uint32_t) atoi( SamplesPerPixel.c_str() ); - int iBitsAllocated = (uint32_t) atoi( BitsAllocated.c_str() ); - - int lgrImage = iRows*iColumns * iSamplesPerPixel * (iSamplesPerPixel/8); + // we brutally suppose all the images within a Papyrus file // have the same caracteristics. @@ -158,12 +156,20 @@ int main(int argc, char* argv[]) HighBit = sqi->GetEntry(0x0028,0x0102); PixelRepresentation = sqi->GetEntry(0x0028,0x0102); + // just convert those needed to compute PixelArea length + int iRows = (uint32_t) atoi( Rows.c_str() ); + int iColumns = (uint32_t) atoi( Columns.c_str() ); + int iSamplesPerPixel = (uint32_t) atoi( SamplesPerPixel.c_str() ); + int iBitsAllocated = (uint32_t) atoi( BitsAllocated.c_str() ); + + int lgrImage = iRows*iColumns * iSamplesPerPixel * (iBitsAllocated/8); + // compute number of images int nbImages = 0; while (sqi) { nbImages++; - sqi = seqPapyrus->GetNextEntry(); + sqi = seqPapyrus->GetNextSQItem(); } std::cout <<"Number of frames :" << nbImages << std::endl; @@ -171,7 +177,7 @@ int main(int argc, char* argv[]) uint8_t *PixelArea = new uint8_t[lgrImage*nbImages]; uint8_t *currentPosition = PixelArea; - gdcm::BinEntry *pixels; + gdcm::BinEntry *pixels; // declare and open the file std::ifstream *Fp; @@ -189,7 +195,7 @@ int main(int argc, char* argv[]) uint32_t offset; std::string previousRows = Rows; - sqi = seqPapyrus->GetFirstEntry(); + sqi = seqPapyrus->GetFirstSQItem(); while (sqi) { std::cout << "One more image read. Keep waiting" << std::endl; @@ -210,34 +216,42 @@ int main(int argc, char* argv[]) currentPosition +=lgrImage; std::string previousRowNb = Rows; - sqi = seqPapyrus->GetNextEntry(); + + sqi = seqPapyrus->GetNextSQItem(); } // build up a new File, with file info + images info + global pixel area. + std::string NumberOfFrames = gdcm::Util::Format("%d", nbImages); + gdcm::Header *n = new gdcm::Header(); n->InitializeDefaultHeader(); - n->SetEntry(TransferSyntax, 0x0002,0x0010); - n->SetEntry(StudyDate, 0x0008,0x0020); - n->SetEntry(StudyTime, 0x0008,0x0030); - n->SetEntry(Modality, 0x0008,0x0060); - n->SetEntry(PatientName, 0x0010,0x0010); - - n->SetEntry(SamplesPerPixel, 0x0028,0x0002); - n->SetEntry(Rows, 0x0028,0x0010); - n->SetEntry(Columns, 0x0028,0x0011); - n->SetEntry(BitsAllocated, 0x0028,0x0100); - n->SetEntry(BitsStored, 0x0028,0x0101); - n->SetEntry(HighBit, 0x0028,0x0102); - n->SetEntry(PixelRepresentation,0x0028,0x0102); + n->ReplaceOrCreate(MediaStSOPinstUID, 0x0002,0x0002); + // Whe keep default gdcm Transfer Syntax (Explicit VR Little Endian) + // since using Papyrus one (Implicit VR Little Endian) is a mess + //n->ReplaceOrCreate(TransferSyntax, 0x0002,0x0010); + n->ReplaceOrCreate(StudyDate, 0x0008,0x0020); + n->ReplaceOrCreate(StudyTime, 0x0008,0x0030); + n->ReplaceOrCreate(Modality, 0x0008,0x0060); + n->ReplaceOrCreate(PatientName, 0x0010,0x0010); + + n->ReplaceOrCreate(SamplesPerPixel, 0x0028,0x0002); + n->ReplaceOrCreate(NumberOfFrames, 0x0028,0x0008); + n->ReplaceOrCreate(Rows, 0x0028,0x0010); + n->ReplaceOrCreate(Columns, 0x0028,0x0011); + n->ReplaceOrCreate(BitsAllocated, 0x0028,0x0100); + n->ReplaceOrCreate(BitsStored, 0x0028,0x0101); + n->ReplaceOrCreate(HighBit, 0x0028,0x0102); + n->ReplaceOrCreate(PixelRepresentation,0x0028,0x0102); // create the file - gdcm::File *file = new gdcm::File(n); + gdcm::FileHelper *file = new gdcm::FileHelper(n); - file->SetImageData(PixelArea,lgrImage); + file->SetImageData(PixelArea,lgrImage*nbImages); file->SetWriteTypeToDcmExplVR(); + //file->SetPrintLevel(2); file->Print(); // Write the file @@ -247,28 +261,5 @@ int main(int argc, char* argv[]) std::cout <<"Fail to open (write) file:[" << argv[2]<< "]" << std::endl;; return 1; } -/* - std::ofstream *fp2; - fp2 = new std::ofstream(argv[2], std::ios::out | std::ios::binary ); - - if (!fp2) - { - std::cout <<"Fail to open (write) file:" << argv[2] << std::endl;; - return 1; - } - if( !fp2->write((char *)PixelArea, lgrImage) ) - { - std::cout << "Failed\n" - << "File in unwrittable :[" - << argv[2] << "]" << std::endl; - - delete fp2; - delete n; - delete[] PixelArea; - return 1; - } - fp2->close(); - */ - return 0; }