X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmFileHelper.cxx;h=bc56a312b4f7872fa1d8a66aa70553171ac8558e;hb=9b08ef2e93023e33dad3326a0c7d6b5db7b72cd4;hp=f0de399a07f43b301377ea4896c74d8080811576;hpb=8921c6cc0f150378063fb0a2083f30c156b32dec;p=gdcm.git diff --git a/src/gdcmFileHelper.cxx b/src/gdcmFileHelper.cxx index f0de399a..bc56a312 100644 --- a/src/gdcmFileHelper.cxx +++ b/src/gdcmFileHelper.cxx @@ -4,8 +4,8 @@ Module: $RCSfile: gdcmFileHelper.cxx,v $ Language: C++ - Date: $Date: 2005/04/04 15:15:24 $ - Version: $Revision: 1.32 $ + Date: $Date: 2005/05/20 08:27:55 $ + Version: $Revision: 1.40 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -285,7 +285,6 @@ size_t FileHelper::GetImageDataSize() { return PixelWriteConverter->GetUserDataSize(); } - return PixelReadConverter->GetRGBSize(); } @@ -302,7 +301,6 @@ size_t FileHelper::GetImageDataRawSize() { return PixelWriteConverter->GetUserDataSize(); } - return PixelReadConverter->GetRawSize(); } @@ -407,7 +405,7 @@ size_t FileHelper::GetImageDataIntoVector (void *destination, size_t maxSize) return 0; } memcpy( destination, - (void*)PixelReadConverter->GetRaw(), + (void *)PixelReadConverter->GetRaw(), PixelReadConverter->GetRawSize() ); return PixelReadConverter->GetRawSize(); } @@ -524,17 +522,17 @@ bool FileHelper::WriteRawData(std::string const &fileName) if( PixelWriteConverter->GetUserData() ) { - fp1.write( (char*)PixelWriteConverter->GetUserData(), + fp1.write( (char *)PixelWriteConverter->GetUserData(), PixelWriteConverter->GetUserDataSize() ); } else if ( PixelReadConverter->GetRGB() ) { - fp1.write( (char*)PixelReadConverter->GetRGB(), + fp1.write( (char *)PixelReadConverter->GetRGB(), PixelReadConverter->GetRGBSize()); } else if ( PixelReadConverter->GetRaw() ) { - fp1.write( (char*)PixelReadConverter->GetRaw(), + fp1.write( (char *)PixelReadConverter->GetRaw(), PixelReadConverter->GetRawSize()); } else @@ -550,7 +548,7 @@ bool FileHelper::WriteRawData(std::string const &fileName) /** * \brief Writes on disk A SINGLE Dicom file, * using the Implicit Value Representation convention - * NO test is performed on processor "Endiannity". + * NO test is performed on processor "Endianity". * @param fileName name of the file to be created * (any already existing file is overwritten) * @return false if write fails @@ -609,27 +607,26 @@ bool FileHelper::Write(std::string const &fileName) { case ImplicitVR: SetWriteFileTypeToImplicitVR(); - CheckMandatoryElements(); break; case Unknown: // should never happen; ExplicitVR is the default value case ExplicitVR: SetWriteFileTypeToExplicitVR(); - CheckMandatoryElements(); break; case ACR: case ACR_LIBIDO: - // Just to avoid further trouble if user create a file ex-nihilo, + // NOTHING is done here just for LibIDO. + // Just to avoid further trouble if user creates a file ex-nihilo, // wants to write it as an ACR-NEMA file, - // and forget to create any Entry belonging to group 0008 + // and forgets to create any Entry belonging to group 0008 // (shame on him !) // We add Recognition Code (RET) if ( ! FileInternal->GetValEntry(0x0008, 0x0010) ) FileInternal->InsertValEntry("", 0x0008, 0x0010); SetWriteFileTypeToACR(); + SetWriteFileTypeToImplicitVR(); break; - SetWriteFileTypeToExplicitVR(); - CheckMandatoryElements(); } + CheckMandatoryElements(); // -------------------------------------------------------------- // Special Patch to allow gdcm to re-write ACR-LibIDO formated images @@ -698,14 +695,17 @@ bool FileHelper::CheckWriteIntegrity() int numberBitsAllocated = FileInternal->GetBitsAllocated(); if ( numberBitsAllocated == 0 || numberBitsAllocated == 12 ) { + gdcmWarningMacro( "numberBitsAllocated changed from " + << numberBitsAllocated << " to 16 " + << " for consistency purpose" ); numberBitsAllocated = 16; } size_t decSize = FileInternal->GetXSize() - * FileInternal->GetYSize() - * FileInternal->GetZSize() - * ( numberBitsAllocated / 8 ) - * FileInternal->GetSamplesPerPixel(); + * FileInternal->GetYSize() + * FileInternal->GetZSize() + * FileInternal->GetSamplesPerPixel() + * ( numberBitsAllocated / 8 ); size_t rgbSize = decSize; if( FileInternal->HasLUT() ) rgbSize = decSize * 3; @@ -731,8 +731,7 @@ bool FileHelper::CheckWriteIntegrity() } break; } - } - + } return true; } @@ -1103,6 +1102,7 @@ BinEntry *FileHelper::CopyBinEntry(uint16_t group, uint16_t elem, void FileHelper::CheckMandatoryElements() { + // just to remember : 'official' 0002 group //0002 0000 UL 1 Meta Group Length @@ -1129,6 +1129,7 @@ void FileHelper::CheckMandatoryElements() e_0002_0001->SetLength(2); Archive->Push(e_0002_0001); + // 'Media Stored SOP Class UID' 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"); @@ -1160,7 +1161,58 @@ void FileHelper::CheckMandatoryElements() Archive->Push(0x0028,0x0017); Archive->Push(0x0028,0x00199); - // --- Check UID-related Entries --- + // Deal with the pb of (Bits Stored = 12) + // - we're gonna write the image as Bits Stored = 16 + if ( FileInternal->GetEntryValue(0x0028,0x0100) == "12") + { + ValEntry *e_0028_0100 = CopyValEntry(0x0028,0x0100); + e_0028_0100->SetValue("16"); + Archive->Push(e_0028_0100); + } + + // 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 @@ -1170,7 +1222,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) @@ -1187,9 +1239,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); @@ -1364,6 +1416,24 @@ void FileHelper::RestoreWriteMandatory() 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); + } //----------------------------------------------------------------------------- @@ -1387,7 +1457,10 @@ void FileHelper::Initialize() } /** - * \brief + * \brief Reads/[decompresses] the pixels, + * *without* making RGB from Palette Colors + * @return the pixels area, whatever its type + * (uint8_t is just for prototyping : feel free to Cast it) */ uint8_t *FileHelper::GetRaw() { @@ -1407,12 +1480,15 @@ uint8_t *FileHelper::GetRaw() return 0; } } - return raw; } //----------------------------------------------------------------------------- -// Print +/** + * \brief Prints the common part of ValEntry, BinEntry, SeqEntry + * @param os ostream we want to print in + * @param indent (unused) + */ void FileHelper::Print(std::ostream &os, std::string const &) { FileInternal->SetPrintLevel(PrintLevel);