X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmFileHelper.cxx;h=c99d06471a0fd7fbc9e47e25453425c8c2df7ef0;hb=3abb6c11e8de2088367ed37676e5748e05084242;hp=9e2ad9bba34af51f0946ef9b1d7121fe1ad090a2;hpb=4f1339cf2b02a0b5dbad52de043ec93f86956982;p=gdcm.git diff --git a/src/gdcmFileHelper.cxx b/src/gdcmFileHelper.cxx index 9e2ad9bb..c99d0647 100644 --- a/src/gdcmFileHelper.cxx +++ b/src/gdcmFileHelper.cxx @@ -4,8 +4,8 @@ Module: $RCSfile: gdcmFileHelper.cxx,v $ Language: C++ - Date: $Date: 2005/04/29 15:11:56 $ - Version: $Revision: 1.36 $ + Date: $Date: 2005/05/27 10:51:00 $ + Version: $Revision: 1.42 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -238,7 +238,7 @@ bool FileHelper::SetBinEntry(uint8_t *content, int lgth, ValEntry *FileHelper::InsertValEntry(std::string const &content, uint16_t group, uint16_t elem) { - return FileInternal->InsertValEntry(content,group,elem); + return FileInternal->InsertValEntry(content, group, elem); } /** @@ -623,7 +623,7 @@ bool FileHelper::Write(std::string const &fileName) if ( ! FileInternal->GetValEntry(0x0008, 0x0010) ) FileInternal->InsertValEntry("", 0x0008, 0x0010); SetWriteFileTypeToACR(); - SetWriteFileTypeToImplicitVR(); + // SetWriteFileTypeToImplicitVR(); // ACR IS implicit VR ! break; } CheckMandatoryElements(); @@ -695,6 +695,9 @@ bool FileHelper::CheckWriteIntegrity() int numberBitsAllocated = FileInternal->GetBitsAllocated(); if ( numberBitsAllocated == 0 || numberBitsAllocated == 12 ) { + gdcmWarningMacro( "numberBitsAllocated changed from " + << numberBitsAllocated << " to 16 " + << " for consistency purpose" ); numberBitsAllocated = 16; } @@ -1100,7 +1103,10 @@ BinEntry *FileHelper::CopyBinEntry(uint16_t group, uint16_t elem, void FileHelper::CheckMandatoryElements() { // just to remember : 'official' 0002 group - + if ( WriteType != ACR && WriteType != ACR_LIBIDO ) + { + // Group 000002 (Meta Elements) already pushed out + //0002 0000 UL 1 Meta Group Length //0002 0001 OB 1 File Meta Information Version //0002 0002 UI 1 Media Stored SOP Class UID @@ -1115,34 +1121,34 @@ void FileHelper::CheckMandatoryElements() // Create them if not found // Always modify the value // Push the entries to the archive. - ValEntry *e_0002_0000 = CopyValEntry(0x0002,0x0000); + ValEntry *e_0002_0000 = CopyValEntry(0x0002,0x0000); e_0002_0000->SetValue("0"); // for the moment Archive->Push(e_0002_0000); - BinEntry *e_0002_0001 = CopyBinEntry(0x0002,0x0001, "OB"); + BinEntry *e_0002_0001 = CopyBinEntry(0x0002,0x0001, "OB"); e_0002_0001->SetBinArea((uint8_t*)Util::GetFileMetaInformationVersion(), false); e_0002_0001->SetLength(2); Archive->Push(e_0002_0001); // 'Media Stored SOP Class UID' - ValEntry *e_0002_0002 = CopyValEntry(0x0002,0x0002); + ValEntry *e_0002_0002 = CopyValEntry(0x0002,0x0002); // [Secondary Capture Image Storage] e_0002_0002->SetValue("1.2.840.10008.5.1.4.1.1.7"); Archive->Push(e_0002_0002); // 'Media Stored SOP Instance UID' - ValEntry *e_0002_0003 = CopyValEntry(0x0002,0x0003); + ValEntry *e_0002_0003 = CopyValEntry(0x0002,0x0003); e_0002_0003->SetValue(Util::CreateUniqueUID()); Archive->Push(e_0002_0003); // 'Implementation Class UID' - ValEntry *e_0002_0012 = CopyValEntry(0x0002,0x0012); + ValEntry *e_0002_0012 = CopyValEntry(0x0002,0x0012); e_0002_0012->SetValue(Util::CreateUniqueUID()); Archive->Push(e_0002_0012); // 'Implementation Version Name' - ValEntry *e_0002_0013 = CopyValEntry(0x0002,0x0013); + ValEntry *e_0002_0013 = CopyValEntry(0x0002,0x0013); e_0002_0013->SetValue("GDCM 1.0"); Archive->Push(e_0002_0013); @@ -1150,6 +1156,7 @@ void FileHelper::CheckMandatoryElements() //ValEntry *e_0002_0016 = CopyValEntry(0x0002,0x0016); // e_0002_0016->SetValue("1.2.840.10008.5.1.4.1.1.7"); // Archive->Push(e_0002_0016); + } // Push out 'LibIDO-special' entries, if any Archive->Push(0x0028,0x0015); @@ -1166,7 +1173,49 @@ void FileHelper::CheckMandatoryElements() Archive->Push(e_0028_0100); } - // --- Check UID-related Entries --- + // Check if user wasn't drunk ;-) + + std::ostringstream s; + // check 'Bits Allocated' vs decent values + int nbBitsAllocated = FileInternal->GetBitsAllocated(); + if ( nbBitsAllocated == 0 || nbBitsAllocated > 32) + { + ValEntry *e_0028_0100 = CopyValEntry(0x0028,0x0100); + e_0028_0100->SetValue("16"); + Archive->Push(e_0028_0100); + gdcmWarningMacro("(0028,0100) changed from " + << nbBitsAllocated << " to 16 for consistency purpose"); + nbBitsAllocated = 16; + } + // check 'Bits Stored' vs 'Bits Allocated' + int nbBitsStored = FileInternal->GetBitsStored(); + if ( nbBitsStored == 0 || nbBitsStored > nbBitsAllocated ) + { + s << nbBitsAllocated; + ValEntry *e_0028_0101 = CopyValEntry(0x0028,0x0101); + e_0028_0101->SetValue( s.str() ); + Archive->Push(e_0028_0101); + gdcmWarningMacro("(0028,0101) changed from " + << nbBitsStored << " to " << nbBitsAllocated + << " for consistency purpose" ); + nbBitsStored = nbBitsAllocated; + } + // check 'Hight Bit Position' vs 'Bits Allocated' and 'Bits Stored' + int highBitPosition = FileInternal->GetHighBitPosition(); + if ( highBitPosition == 0 || + highBitPosition > nbBitsAllocated-1 || + highBitPosition < nbBitsStored-1 ) + { + ValEntry *e_0028_0102 = CopyValEntry(0x0028,0x0102); + + s << nbBitsStored - 1; + e_0028_0102->SetValue( s.str() ); + Archive->Push(e_0028_0102); + gdcmWarningMacro("(0028,0102) changed from " + << highBitPosition << " to " << nbBitsAllocated-1 + << " for consistency purpose"); + } + // --- Check UID-related Entries --- // If 'SOP Class UID' exists ('true DICOM' image) // we create the 'Source Image Sequence' SeqEntry @@ -1176,7 +1225,7 @@ void FileHelper::CheckMandatoryElements() if ( e_0008_0016 != 0 ) { // Create 'Source Image Sequence' SeqEntry - SeqEntry *s = new SeqEntry ( + SeqEntry *sis = new SeqEntry ( Global::GetDicts()->GetDefaultPubDict()->GetEntry(0x0008, 0x2112) ); SQItem *sqi = new SQItem(1); // (we assume 'SOP Instance UID' exists too) @@ -1193,9 +1242,9 @@ void FileHelper::CheckMandatoryElements() e_0008_1155->SetValue( e_0008_0018->GetValue()); sqi->AddEntry(e_0008_1155); - s->AddSQItem(sqi,1); + sis->AddSQItem(sqi,1); // temporarily replaces any previous 'Source Image Sequence' - Archive->Push(s); + Archive->Push(sis); // 'Image Type' (The written image is no longer an 'ORIGINAL' one) ValEntry *e_0008_0008 = CopyValEntry(0x0008,0x0008); @@ -1365,11 +1414,30 @@ void FileHelper::RestoreWriteMandatory() Archive->Restore(0x0002,0x0001); Archive->Restore(0x0002,0x0002); Archive->Restore(0x0002,0x0003); + Archive->Restore(0x0002,0x0010); Archive->Restore(0x0002,0x0012); Archive->Restore(0x0002,0x0013); Archive->Restore(0x0002,0x0016); Archive->Restore(0x0002,0x0100); Archive->Restore(0x0002,0x0102); + + Archive->Restore(0x0008,0x0012); + Archive->Restore(0x0008,0x0013); + Archive->Restore(0x0008,0x0016); + Archive->Restore(0x0008,0x0018); + Archive->Restore(0x0008,0x0060); + Archive->Restore(0x0008,0x0070); + Archive->Restore(0x0008,0x0080); + Archive->Restore(0x0008,0x0090); + Archive->Restore(0x0008,0x2112); + + Archive->Restore(0x0010,0x0010); + Archive->Restore(0x0010,0x0030); + Archive->Restore(0x0010,0x0040); + + Archive->Restore(0x0020,0x000d); + Archive->Restore(0x0020,0x000e); + } //-----------------------------------------------------------------------------