X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmFile.cxx;h=71e8a7782c480f78418d2a0f8eed787410a826f3;hb=de5fc413dc579fc61f7e04397efd1dc1087fe3cf;hp=c1381c8621f169d66cc59927f4722cfa6b8607fa;hpb=3f99e798955f65c1b906ad65016d1b49bde25ef8;p=gdcm.git diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index c1381c86..71e8a778 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFile.cxx,v $ Language: C++ - Date: $Date: 2005/02/17 11:02:47 $ - Version: $Revision: 1.225 $ + Date: $Date: 2005/04/19 09:58:19 $ + Version: $Revision: 1.233 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -46,12 +46,25 @@ namespace gdcm { //----------------------------------------------------------------------------- // Constructor / Destructor + +/** + * \brief Constructor used when we want to generate dicom files from scratch + */ +File::File(): + Document() +{ + RLEInfo = new RLEFramesInfo; + JPEGInfo = new JPEGFragmentsInfo; + GrPixel = 0x7fe0; + NumPixel = 0x0010; +} + /** * \brief Constructor * @param filename name of the file whose header we want to analyze */ File::File( std::string const &filename ) - :Document( filename ) + :Document(filename) { RLEInfo = new RLEFramesInfo; JPEGInfo = new JPEGFragmentsInfo; @@ -145,16 +158,6 @@ File::File( std::string const &filename ) } } -/** - * \brief Constructor used when we want to generate dicom files from scratch - */ -File::File(): - Document() -{ - RLEInfo = new RLEFramesInfo; - JPEGInfo = new JPEGFragmentsInfo; - InitializeDefaultFile(); -} /** * \brief Canonical destructor. @@ -169,6 +172,8 @@ File::~File () //----------------------------------------------------------------------------- // Public + + /** * \brief This predicate, based on hopefully reasonable heuristics, * decides whether or not the current File was properly parsed @@ -263,10 +268,14 @@ ModalityType File::GetModality() else if ( strModality.find("PT") < strModality.length()) return PT; else if ( strModality.find("RF") < strModality.length()) return RF; else if ( strModality.find("RG") < strModality.length()) return RG; - else if ( strModality.find("RTDOSE") < strModality.length()) return RTDOSE; - else if ( strModality.find("RTIMAGE") < strModality.length()) return RTIMAGE; - else if ( strModality.find("RTPLAN") < strModality.length()) return RTPLAN; - else if ( strModality.find("RTSTRUCT") < strModality.length()) return RTSTRUCT; + else if ( strModality.find("RTDOSE") + < strModality.length()) return RTDOSE; + else if ( strModality.find("RTIMAGE") + < strModality.length()) return RTIMAGE; + else if ( strModality.find("RTPLAN") + < strModality.length()) return RTPLAN; + else if ( strModality.find("RTSTRUCT") + < strModality.length()) return RTSTRUCT; else if ( strModality.find("SM") < strModality.length()) return SM; else if ( strModality.find("ST") < strModality.length()) return ST; else if ( strModality.find("TG") < strModality.length()) return TG; @@ -818,20 +827,21 @@ std::string File::GetPixelType() } /** - * \brief Check whether the pixels are signed or UNsigned data. - * \warning The method defaults to false (UNsigned) when information is Missing. + * \brief Check whether the pixels are signed (1) or UNsigned (0) data. + * \warning The method defaults to false (UNsigned) when tag 0028|0103 + * is missing. * The responsability of checking this value is left to the caller. * @return True when signed, false when UNsigned */ bool File::IsSignedPixelData() { - std::string strSize = GetEntryValue( 0x0028, 0x0103 ); - if ( strSize == GDCM_UNFOUND ) + std::string strSign = GetEntryValue( 0x0028, 0x0103 ); + if ( strSign == GDCM_UNFOUND ) { gdcmWarningMacro( "(0028,0103) is supposed to be mandatory"); return false; } - int sign = atoi( strSize.c_str() ); + int sign = atoi( strSign.c_str() ); if ( sign == 0 ) { return false; @@ -1171,12 +1181,7 @@ void File::AddAnonymizeElement (uint16_t group, uint16_t elem, void File::AnonymizeNoLoad() { std::fstream *fp = new std::fstream(Filename.c_str(), - std::ios::in | std::ios::out | std::ios::binary); - - // TODO : FIXME - // how to white out disk space if longer than 50 ? - - + std::ios::in | std::ios::out | std::ios::binary); gdcm::DocEntry *d; uint32_t offset; uint32_t lgth; @@ -1409,90 +1414,7 @@ bool File::Write(std::string fileName, FileType writetype) //----------------------------------------------------------------------------- // Protected -/** - * \brief Initialize a default DICOM File that should contain all the - * field require by other reader. DICOM standard does not - * explicitely defines those fields, heuristic has been choosen. - * This is not perfect as we are writting a Secondary Capture image... - */ -void File::InitializeDefaultFile() -{ - std::string date = Util::GetCurrentDate(); - std::string time = Util::GetCurrentTime(); - std::string uid = Util::CreateUniqueUID(); - std::string uidMedia = uid; - std::string uidInst = uid; - std::string uidClass = Util::CreateUniqueUID(); - std::string uidStudy = Util::CreateUniqueUID(); - std::string uidSerie = Util::CreateUniqueUID(); - - // Meta Element Group Length - InsertValEntry("146 ", 0x0002, 0x0000); - // Media Storage SOP Class UID (Secondary Capture Image Storage) - InsertValEntry("1.2.840.10008.5.1.4.1.1.7", 0x0002, 0x0002); - // Media Storage SOP Instance UID - InsertValEntry(uidMedia.c_str(), 0x0002, 0x0003); - // Transfer Syntax UID (Explicit VR Little Endian) - InsertValEntry("1.2.840.10008.1.2.1 ", 0x0002, 0x0010); - // META Implementation Class UID - InsertValEntry(uidClass.c_str(), 0x0002, 0x0012); - // Source Application Entity Title - InsertValEntry("GDCM", 0x0002, 0x0016); - - // Instance Creation Date - InsertValEntry(date.c_str(), 0x0008, 0x0012); - // Instance Creation Time - InsertValEntry(time.c_str(), 0x0008, 0x0013); - // SOP Class UID - InsertValEntry("1.2.840.10008.5.1.4.1.1.2", 0x0008, 0x0016); - // SOP Instance UID - InsertValEntry(uidInst.c_str(), 0x0008, 0x0018); - // Modality - InsertValEntry("CT", 0x0008, 0x0060); - // Manufacturer - InsertValEntry("GDCM", 0x0008, 0x0070); - // Institution Name - InsertValEntry("GDCM", 0x0008, 0x0080); - // Institution Address - InsertValEntry("http://www-creatis.insa-lyon.fr/Public/Gdcm", 0x0008, 0x0081); - - // Patient's Name - InsertValEntry("GDCM", 0x0010, 0x0010); - // Patient ID - InsertValEntry("GDCMID", 0x0010, 0x0020); - - // Study Instance UID - InsertValEntry(uidStudy.c_str(), 0x0020, 0x000d); - // Series Instance UID - InsertValEntry(uidSerie.c_str(), 0x0020, 0x000e); - // StudyID - InsertValEntry("1", 0x0020, 0x0010); - // SeriesNumber - InsertValEntry("1", 0x0020, 0x0011); - - // Samples per pixel 1 or 3 - InsertValEntry("1", 0x0028, 0x0002); - // photochromatic interpretation - InsertValEntry("MONOCHROME1", 0x0028, 0x0004); - // nbRows - InsertValEntry("0", 0x0028, 0x0010); - // nbCols - InsertValEntry("0", 0x0028, 0x0011); - // BitsAllocated 8 or 12 or 16 - InsertValEntry("8", 0x0028, 0x0100); - // BitsStored <= BitsAllocated - InsertValEntry("8", 0x0028, 0x0101); - // HighBit <= BitsAllocated - 1 - InsertValEntry("7", 0x0028, 0x0102); - // Pixel Representation 0(unsigned) or 1(signed) - InsertValEntry("0", 0x0028, 0x0103); - - // default value - // Special case this is the image (not a string) - GrPixel = 0x7fe0; - NumPixel = 0x0010; - InsertBinEntry(0, 0, GrPixel, NumPixel); -} + //----------------------------------------------------------------------------- // Private @@ -1532,7 +1454,7 @@ void File::ComputeRLEInfo() // - when more than one frame are present, then we are in // the case of a multi-frame image. long frameLength; - while ( (frameLength = ReadTagLength(0xfffe, 0xe000)) ) + while ( (frameLength = ReadTagLength(0xfffe, 0xe000)) != 0 ) { // Parse the RLE Header and store the corresponding RLE Segment // Offset Table information on fragments of this current Frame. @@ -1611,7 +1533,7 @@ void File::ComputeJPEGFragmentInfo() // Loop on the fragments[s] and store the parsed information in a // JPEGInfo. long fragmentLength; - while ( (fragmentLength = ReadTagLength(0xfffe, 0xe000)) ) + while ( (fragmentLength = ReadTagLength(0xfffe, 0xe000)) != 0 ) { long fragmentOffset = Fp->tellg();