Program: gdcm
Module: $RCSfile: TestPapyrus.cxx,v $
Language: C++
- Date: $Date: 2005/01/20 11:26:17 $
- Version: $Revision: 1.2 $
+ Date: $Date: 2005/02/02 10:06:32 $
+ Version: $Revision: 1.13 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
-#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 <fstream>
#endif
// return true if the file exists
-bool FileExists(const char* filename)
+bool FileExists(const char *filename)
{
#ifdef _MSC_VER
# define access _access
}
}
-bool RemoveFile(const char* source)
+bool RemoveFile(const char *source)
{
#ifdef _MSC_VER
#define _unlink unlink
}
// ----------------------------------------------------------------------
-// Here we load a supposed to be Papyrus File (gdcm::Header compliant)
+// Here we load a supposed to be Papyrus File (gdcm::File compliant)
// and then try to get the pixels, using low-level SeqEntry accessors.
// Since it's not a general purpose Papyrus related program
// (just a light example) we suppose *everything* is clean
// and we don't perform any integrity check
// ----------------------------------------------------------------------
-// TODO : finish writing the program !
-
-int main(int argc, char* argv[])
+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::DebugOn();
+
if( FileExists( output.c_str() ) )
{
if( !RemoveFile( output.c_str() ) )
return 1;
}
}
- gdcm::File *original = new gdcm::File( filename );
- gdcm::Header *h = original->GetHeader();
+ gdcm::FileHelper *original = new gdcm::FileHelper( filename );
+ gdcm::File *h = original->GetFile();
// Look for private Papyrus Sequence
gdcm::SeqEntry *seqPapyrus= h->GetSeqEntry(0x0041, 0x1050);
- if (!h)
+ if (!seqPapyrus)
{
std::cout << "NOT a Papyrus File" << std::endl;
delete h;
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
- TransferSyntax = h->GetEntry(0x0002,0x0010);
- StudyDate = sqi->GetEntry(0x0008,0x0020);
- StudyTime = sqi->GetEntry(0x0008,0x0030);
- Modality = sqi->GetEntry(0x0008,0x0060);
- PatientName = sqi->GetEntry(0x0010,0x0010);
+ MediaStSOPinstUID = h->GetEntryValue(0x0002,0x0002);
+ TransferSyntax = h->GetEntryValue(0x0002,0x0010);
+ StudyDate = sqi->GetEntryValue(0x0008,0x0020);
+ StudyTime = sqi->GetEntryValue(0x0008,0x0030);
+ Modality = sqi->GetEntryValue(0x0008,0x0060);
+ PatientName = sqi->GetEntryValue(0x0010,0x0010);
std::cout << "TransferSyntax " << TransferSyntax << std::endl;
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.
- // if you're aware they have not, just move the GetEntry
+ // if you're aware they have not, just move the GetEntryValue
// inside the loop
// Get caracteristics of the first image
+ SamplesPerPixel = sqi->GetEntryValue(0x0028,0x0002);
+ Rows = sqi->GetEntryValue(0x0028,0x0010);
+ Columns = sqi->GetEntryValue(0x0028,0x0011);
+ BitsAllocated = sqi->GetEntryValue(0x0028,0x0100);
+ BitsStored = sqi->GetEntryValue(0x0028,0x0101);
+ HighBit = sqi->GetEntryValue(0x0028,0x0102);
+ PixelRepresentation = sqi->GetEntryValue(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() );
- SamplesPerPixel = sqi->GetEntry(0x0028,0x0002);
- Rows = sqi->GetEntry(0x0028,0x0010);
- Columns = sqi->GetEntry(0x0028,0x0011);
- BitsAllocated = sqi->GetEntry(0x0028,0x0100);
- BitsStored = sqi->GetEntry(0x0028,0x0101);
- HighBit = sqi->GetEntry(0x0028,0x0102);
- PixelRepresentation = sqi->GetEntry(0x0028,0x0102);
+ int lgrImage = iRows*iColumns * iSamplesPerPixel * (iBitsAllocated/8);
// compute number of images
- int nbImages = 0;
- while (sqi)
- {
- nbImages++;
- sqi = seqPapyrus->GetNextSQItem();
- }
+ int nbImages = seqPapyrus->GetNumberOfSQItems();
std::cout <<"Number of frames :" << nbImages << std::endl;
// allocate enough room to get the pixels of all images.
-
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;
return 0;
}
// to be sure to be at the beginning
- Fp->seekg(0, std::ios::end);
+ Fp->seekg(0, std::ios::end);
uint32_t offset;
std::string previousRows = Rows;
while (sqi)
{
std::cout << "One more image read. Keep waiting" << std::endl;
- Rows = sqi->GetEntry(0x0028,0x0010);
+ Rows = sqi->GetEntryValue(0x0028,0x0010);
// minimum integrity check
if (Rows != previousRows)
{
currentPosition +=lgrImage;
std::string previousRowNb = Rows;
+
sqi = seqPapyrus->GetNextSQItem();
}
// build up a new File, with file info + images info + global pixel area.
- gdcm::Header *n = new gdcm::Header();
- n->InitializeDefaultHeader();
+ std::string NumberOfFrames = gdcm::Util::Format("%d", nbImages);
+
+ gdcm::File *n = new gdcm::File();
- 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->InsertValEntry(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->InsertValEntry(TransferSyntax, 0x0002,0x0010);
+ n->InsertValEntry(StudyDate, 0x0008,0x0020);
+ n->InsertValEntry(StudyTime, 0x0008,0x0030);
+ n->InsertValEntry(Modality, 0x0008,0x0060);
+ n->InsertValEntry(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->InsertValEntry(SamplesPerPixel, 0x0028,0x0002);
+ n->InsertValEntry(NumberOfFrames, 0x0028,0x0008);
+ n->InsertValEntry(Rows, 0x0028,0x0010);
+ n->InsertValEntry(Columns, 0x0028,0x0011);
+ n->InsertValEntry(BitsAllocated, 0x0028,0x0100);
+ n->InsertValEntry(BitsStored, 0x0028,0x0101);
+ n->InsertValEntry(HighBit, 0x0028,0x0102);
+ n->InsertValEntry(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
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;
}