From: regrain Date: Thu, 25 Nov 2004 10:24:32 +0000 (+0000) Subject: * src/gdcmDocument.cxx : fix bug... test if the fp is opened to use it X-Git-Tag: Version1.0.bp~569 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=e5e7b1bd7ee84e8f9dc7da5d1d42b598fac68399;p=gdcm.git * src/gdcmDocument.cxx : fix bug... test if the fp is opened to use it * src/gdcmPixelConvert.cxx : calculate the image size when while the grab of the header. * src/gdcmFile.[h|cxx] : remove PixelRead and ImageDataSizeRaw variables and some corresponding methods. Write correctly the file and check before write * Test/TestCopyDicom.cxx, TestReadWriteReadCompare.cxx, TestAllReadCompareDicom.cxx : pass the write of images to RGB and test is now on RGB datas (as before my last commit * Example/PrintHeader.cxx, PrintFile.cxx : repad files. -- BeNours --- diff --git a/ChangeLog b/ChangeLog index c96d898f..532ab0bd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2004-11-25 Benoit Regrain + * src/gdcmDocument.cxx : fix bug... test if the fp is opened to use it + * src/gdcmPixelConvert.cxx : calculate the image size when while the grab of + the header. + * src/gdcmFile.[h|cxx] : remove PixelRead and ImageDataSizeRaw variables and + some corresponding methods. Write correctly the file and check before + write + * Test/TestCopyDicom.cxx, TestReadWriteReadCompare.cxx, + TestAllReadCompareDicom.cxx : pass the write of images to RGB and test + is now on RGB datas (as before my last commit + * Example/PrintHeader.cxx, PrintFile.cxx : repad files. + 2004-11-24 Benoit Regrain * src/gdcmBinEntry.cxx, gdcmSeqEntry.cxx, gdcmSQItem.cxx, gdcmValEntry.cxx : Add a print information of the type of the entry diff --git a/Example/PrintFile.cxx b/Example/PrintFile.cxx index 4b02c55b..7cc42f70 100644 --- a/Example/PrintFile.cxx +++ b/Example/PrintFile.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: PrintFile.cxx,v $ Language: C++ - Date: $Date: 2004/11/24 16:39:17 $ - Version: $Revision: 1.13 $ + Date: $Date: 2004/11/25 10:24:33 $ + Version: $Revision: 1.14 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -20,35 +20,36 @@ int main(int argc, char* argv[]) { - gdcm::Header *e1; gdcm::File *f1; std::string fileName; - if (argc != 2) { + if (argc != 2) + { std::cout << " usage : PrintDocument fileName" << std::endl; } - if (argc > 1) { + if (argc > 1) + { fileName=argv[1]; - } else { + } + else + { fileName += GDCM_DATA_ROOT; fileName += "/test.acr"; } e1= new gdcm::Header( fileName.c_str() ); - f1 = new gdcm::File(e1); e1->SetPrintLevel(2); - e1->Print(); - + std::cout << "\n\n" << std::endl; - int dataSize = f1->GetImageDataSize(); std::cout <GetImageDataSizeRaw() << std::endl; + std::cout <<" dataSize " << f1->GetImageDataSize() << std::endl; + std::cout <<" dataSizeRaw " << f1->GetImageDataRawSize() << std::endl; + int nX,nY,nZ,sPP,planarConfig; std::string pixelType; nX=e1->GetXSize(); @@ -74,12 +75,13 @@ int main(int argc, char* argv[]) << std::endl; - if ( e1->GetEntryByNumber(0x0002,0x0010) == gdcm::GDCM_NOTLOADED ) { - std::cout << "Transfert Syntax not loaded. " << std::endl - << "Better you increase MAX_SIZE_LOAD_ELEMENT_VALUE" - << std::endl; + if ( e1->GetEntryByNumber(0x0002,0x0010) == gdcm::GDCM_NOTLOADED ) + { + std::cout << "Transfert Syntax not loaded. " << std::endl + << "Better you increase MAX_SIZE_LOAD_ELEMENT_VALUE" + << std::endl; return 0; - } + } std::string transferSyntaxName = e1->GetTransfertSyntaxName(); std::cout << " TransferSyntaxName= [" << transferSyntaxName << "]" << std::endl; @@ -89,13 +91,13 @@ int main(int argc, char* argv[]) && transferSyntaxName != "Deflated Explicit VR - Little Endian" && transferSyntaxName != "Explicit VR - Big Endian" && transferSyntaxName != "Uncompressed ACR-NEMA" ) - { + { std::cout << std::endl << "===========================================" << std::endl; f1->GetPixelConverter()->Print(); std::cout << std::endl << "===========================================" << std::endl; - } + } if(e1->IsReadable()) std::cout <GetHeader(); - - if (argc > 2) { + + gdcm::File *f1 = new gdcm::File( fileName.c_str() ); + gdcm::Header *e1 = f1->GetHeader(); + + if (argc > 2) + { int level = atoi(argv[2]); e1->SetPrintLevel(level); } - e1->Print(); - - std::cout << "\n\n" << std::endl; - - if ( e1->GetEntryByNumber(0x0002,0x0010) == gdcm::GDCM_NOTLOADED ) { - std::cout << "Transfert Syntax not loaded. " << std::endl - << "Better you increase MAX_SIZE_LOAD_ELEMENT_VALUE" - << std::endl; - return 0; - } - - std::string transferSyntaxName = e1->GetTransfertSyntaxName(); - std::cout << " TransferSyntaxName= [" << transferSyntaxName << "]" << std::endl; - + e1->Print(); + + std::cout << "\n\n" << std::endl; + + if ( e1->GetEntryByNumber(0x0002,0x0010) == gdcm::GDCM_NOTLOADED ) + { + std::cout << "Transfert Syntax not loaded. " << std::endl + << "Better you increase MAX_SIZE_LOAD_ELEMENT_VALUE" + << std::endl; + return 0; + } + + std::string transferSyntaxName = e1->GetTransfertSyntaxName(); + std::cout << " TransferSyntaxName= [" << transferSyntaxName << "]" << std::endl; + if ( transferSyntaxName != "Implicit VR - Little Endian" && transferSyntaxName != "Explicit VR - Little Endian" && transferSyntaxName != "Deflated Explicit VR - Little Endian" && transferSyntaxName != "Explicit VR - Big Endian" && transferSyntaxName != "Uncompressed ACR-NEMA" ) - { - std::cout << std::endl << "===========================================" - << std::endl; - e2->GetPixelConverter()->Print(); - std::cout << std::endl << "===========================================" - << std::endl; - } - + { + std::cout << std::endl << "===========================================" + << std::endl; + f1->GetPixelConverter()->Print(); + std::cout << std::endl << "===========================================" + << std::endl; + } + if(e1->IsReadable()) std::cout <GetImageDataRaw(); // Kludge + uint8_t* testedImageData = tested->GetImageData(); // Kludge (void)testedImageData; + tested->SetWriteModeToRGB(); tested->WriteDcmExplVR( referenceFileName ); } else @@ -74,11 +75,11 @@ int InternalTest(std::string const & filename, ////// Step 3b: std::cout << "3b..."; - int testedDataSize = tested->GetImageDataSizeRaw(); - uint8_t* testedImageData = tested->GetImageDataRaw(); + int testedDataSize = tested->GetImageDataSize(); + uint8_t* testedImageData = tested->GetImageData(); - int referenceDataSize = reference->GetImageDataSizeRaw(); - uint8_t* referenceImageData = reference->GetImageDataRaw(); + int referenceDataSize = reference->GetImageDataSize(); + uint8_t* referenceImageData = reference->GetImageData(); if (testedDataSize != referenceDataSize) { diff --git a/Testing/TestCopyDicom.cxx b/Testing/TestCopyDicom.cxx index 347ea302..c7e74012 100644 --- a/Testing/TestCopyDicom.cxx +++ b/Testing/TestCopyDicom.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: TestCopyDicom.cxx,v $ Language: C++ - Date: $Date: 2004/11/25 08:14:58 $ - Version: $Revision: 1.21 $ + Date: $Date: 2004/11/25 10:24:33 $ + Version: $Revision: 1.22 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -73,13 +73,8 @@ int CopyDicom(std::string const & filename, //////////////// Step 1: std::cout << " 1..."; - gdcm::File *original = new gdcm::File( filename ); - gdcm::File *copy = new gdcm::File( output ); - - size_t dataSize = original->GetImageDataSizeRaw(); - uint8_t* imageData = original->GetImageDataRaw(); - (void)dataSize; // To use the variable and not have warnings at compil. - (void)imageData; // To use the variable and not have warnings at compil. + gdcm::Header *originalH = new gdcm::Header( filename ); + gdcm::Header *copyH = new gdcm::Header( output ); //First of all copy the header field by field @@ -91,14 +86,14 @@ int CopyDicom(std::string const & filename, //////////////// Step 2: std::cout << "2..."; - original->GetHeader()->Initialize(); - gdcm::DocEntry* d=original->GetHeader()->GetNextEntry(); + originalH->Initialize(); + gdcm::DocEntry* d=originalH->GetNextEntry(); while(d) { if ( gdcm::BinEntry* b = dynamic_cast(d) ) { - copy->GetHeader()->ReplaceOrCreateByNumber( + copyH->ReplaceOrCreateByNumber( b->GetBinArea(), b->GetLength(), b->GetGroup(), @@ -107,7 +102,7 @@ int CopyDicom(std::string const & filename, } else if ( gdcm::ValEntry* v = dynamic_cast(d) ) { - copy->GetHeader()->ReplaceOrCreateByNumber( + copyH->ReplaceOrCreateByNumber( v->GetValue(), v->GetGroup(), v->GetElement(), @@ -122,9 +117,14 @@ int CopyDicom(std::string const & filename, // << std::endl; } - d=original->GetHeader()->GetNextEntry(); + d=originalH->GetNextEntry(); } + gdcm::File *original = new gdcm::File( originalH ); + gdcm::File *copy = new gdcm::File( copyH ); + + size_t dataSize = original->GetImageDataSize(); + uint8_t* imageData = original->GetImageData(); // Useless to set the image datas, because it's already made when // copying the corresponding BinEntry that contains the pixel datas @@ -134,9 +134,22 @@ int CopyDicom(std::string const & filename, //////////////// Step 3: std::cout << "3..."; - copy->WriteDcmExplVR( output ); + copy->SetWriteModeToRGB(); + if( !copy->WriteDcmExplVR(output) ) + { + std::cout << " Failed" << std::endl + << " " << output << " not written" << std::endl; + + delete original; + delete copy; + delete originalH; + delete copyH; + + return 1; + } delete copy; + delete copyH; //////////////// Step 4: std::cout << "4..."; @@ -145,24 +158,29 @@ int CopyDicom(std::string const & filename, //Is the file written still gdcm parsable ? if ( !copy->GetHeader()->IsReadable() ) { - std::cout << "=> " << output << " Failed" << std::endl; + std::cout << " Failed" << std::endl + << " " << output << " not readable" << std::endl; + delete original; - return(1); + delete originalH; + + return 1; } //////////////// Step 5: std::cout << "5..."; - size_t dataSizeWritten = copy->GetImageDataSizeRaw(); - uint8_t* imageDataWritten = copy->GetImageDataRaw(); + size_t dataSizeWritten = copy->GetImageDataSize(); + uint8_t* imageDataWritten = copy->GetImageData(); if (dataSize != dataSizeWritten) { std::cout << " Failed" << std::endl - << " Pixel areas lengths differ: " - << dataSize << " # " << dataSizeWritten << std::endl; + << " Pixel areas lengths differ: " + << dataSize << " # " << dataSizeWritten << std::endl; delete original; delete copy; + delete originalH; return 1; } @@ -171,10 +189,11 @@ int CopyDicom(std::string const & filename, { (void)res; std::cout << " Failed" << std::endl - << " Pixel differ (as expanded in memory)." << std::endl; + << " Pixel differ (as expanded in memory)." << std::endl; delete original; delete copy; + delete originalH; return 1; } @@ -182,6 +201,7 @@ int CopyDicom(std::string const & filename, delete original; delete copy; + delete originalH; return 0; } @@ -240,7 +260,6 @@ int TestCopyDicom(int argc, char* argv[]) filename += "/"; //doh! filename += gdcmDataImages[i]; -// std::string output = "../Testing/Temporary/output.dcm"; std::string output = "output.dcm"; if( CopyDicom( filename, output ) != 0 ) diff --git a/Testing/TestReadWriteReadCompare.cxx b/Testing/TestReadWriteReadCompare.cxx index 24a2a763..b5359ba8 100644 --- a/Testing/TestReadWriteReadCompare.cxx +++ b/Testing/TestReadWriteReadCompare.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: TestReadWriteReadCompare.cxx,v $ Language: C++ - Date: $Date: 2004/11/24 16:39:18 $ - Version: $Revision: 1.15 $ + Date: $Date: 2004/11/25 10:24:34 $ + Version: $Revision: 1.16 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -40,8 +40,8 @@ int CompareInternal(std::string const & filename, std::string const & output) //////////////// Step 2: gdcm::File* file = new gdcm::File( header ); - int dataSize = file->GetImageDataSizeRaw(); - uint8_t* imageData = file->GetImageDataRaw(); //EXTREMELY IMPORTANT + int dataSize = file->GetImageDataSize(); + uint8_t* imageData = file->GetImageData(); //EXTREMELY IMPORTANT // Sure, it is : It's up to the user to decide if he wants to // GetImageData or if he wants to GetImageDataRaw // (even if we do it by setting a flag, he will have to decide) @@ -83,8 +83,8 @@ int CompareInternal(std::string const & filename, std::string const & output) } std::cout << "3..."; // For the next step: - int dataSizeWritten = reread->GetImageDataSizeRaw(); - uint8_t* imageDataWritten = reread->GetImageDataRaw(); + int dataSizeWritten = reread->GetImageDataSize(); + uint8_t* imageDataWritten = reread->GetImageData(); //////////////// Step 4: diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index c5079fe4..73c7ecf7 100644 --- a/src/gdcmDocument.cxx +++ b/src/gdcmDocument.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocument.cxx,v $ Language: C++ - Date: $Date: 2004/11/24 16:39:18 $ - Version: $Revision: 1.137 $ + Date: $Date: 2004/11/25 10:24:34 $ + Version: $Revision: 1.138 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -1286,9 +1286,12 @@ ValEntry* Document::GetValEntryByNumber(uint16_t group, uint16_t element) */ void Document::LoadDocEntrySafe(DocEntry * entry) { - long PositionOnEntry = Fp->tellg(); - LoadDocEntry(entry); - Fp->seekg(PositionOnEntry, std::ios_base::beg); + if(Fp) + { + long PositionOnEntry = Fp->tellg(); + LoadDocEntry(entry); + Fp->seekg(PositionOnEntry, std::ios_base::beg); + } } /** diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index 46e1f4c0..60c86429 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFile.cxx,v $ Language: C++ - Date: $Date: 2004/11/24 16:39:18 $ - Version: $Revision: 1.162 $ + Date: $Date: 2004/11/25 10:24:34 $ + Version: $Revision: 1.163 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -83,20 +83,11 @@ void File::Initialise() if ( HeaderInternal->IsReadable() ) { - ImageDataSizeRaw = ComputeDecompressedPixelDataSizeFromHeader(); - if ( HeaderInternal->HasLUT() ) - { - ImageDataSize = 3 * ImageDataSizeRaw; - } - else - { - ImageDataSize = ImageDataSizeRaw; - } - PixelConverter->GrabInformationsFromHeader( HeaderInternal ); } - SaveInitialValues(); + Pixel_Data = 0; + ImageDataSize = 0; } /** @@ -122,103 +113,32 @@ File::~File() HeaderInternal = 0; } -/** - * \brief Sets some initial values for the Constructor - * \warning not end user intended - */ -void File::SaveInitialValues() -{ - PixelRead = -1; // no ImageData read yet. - Pixel_Data = 0; -} - //----------------------------------------------------------------------------- // Print //----------------------------------------------------------------------------- // Public - /** - * \brief computes the length (in bytes) we must ALLOCATE to receive the - * image(s) pixels (multiframes taken into account) - * \warning : it is NOT the group 7FE0 length - * (no interest for compressed images). + * \brief Get the size of the image data + * + * If the image can be RGB (with a lut or by default), the size + * corresponds to the RGB image + * @return The image size */ -int File::ComputeDecompressedPixelDataSizeFromHeader() -{ - // see PS 3.3-2003 : C.7.6.3.2.1 - // - // MONOCHROME1 - // MONOCHROME2 - // PALETTE COLOR - // RGB - // HSV (Retired) - // ARGB (Retired) - // CMYK (Retired) - // YBR_FULL - // YBR_FULL_422 (no LUT, no Palette) - // YBR_PARTIAL_422 - // YBR_ICT - // YBR_RCT - - // LUT's - // ex : gdcm-US-ALOKA-16.dcm - // 0028|1221 [OW] [Segmented Red Palette Color Lookup Table Data] - // 0028|1222 [OW] [Segmented Green Palette Color Lookup Table Data] - // 0028|1223 [OW] [Segmented Blue Palette Color Lookup Table Data] - - // ex : OT-PAL-8-face.dcm - // 0028|1201 [US] [Red Palette Color Lookup Table Data] - // 0028|1202 [US] [Green Palette Color Lookup Table Data] - // 0028|1203 [US] [Blue Palette Color Lookup Table Data] - - int numberBitsAllocated = HeaderInternal->GetBitsAllocated(); - // Number of "Bits Allocated" is fixed to 16 when: - // - it is not defined (i.e. it's value is 0) - // - it's 12, since we will expand the image to 16 bits (see - // PixelConvert::ConvertDecompress12BitsTo16Bits() ) - if ( numberBitsAllocated == 0 || numberBitsAllocated == 12 ) - { - numberBitsAllocated = 16; - } - - int DecompressedSize = HeaderInternal->GetXSize() - * HeaderInternal->GetYSize() - * HeaderInternal->GetZSize() - * ( numberBitsAllocated / 8 ) - * HeaderInternal->GetSamplesPerPixel(); - - return DecompressedSize; -} - -/// Accessor to \ref ImageDataSize size_t File::GetImageDataSize() { - if ( ! GetDecompressed() ) - { - // If the decompression failed nothing can be done. - return 0; - } - - if ( HeaderInternal->HasLUT() && PixelConverter->BuildRGBImage() ) - { - return PixelConverter->GetRGBSize(); - } - else - { - // When no LUT or LUT conversion fails, return the decompressed - return PixelConverter->GetDecompressedSize(); - } + return PixelConverter->GetRGBSize(); } -/// Accessor to \ref ImageDataSizeRaw -size_t File::GetImageDataSizeRaw() +/** + * \brief Get the size of the image data + * + * If the image can be RGB by transformation in a LUT, this + * transformation isn't considered + * @return The raw image size + */ +size_t File::GetImageDataRawSize() { - if ( ! GetDecompressed() ) - { - // If the decompression failed nothing can be done. - return 0; - } return PixelConverter->GetDecompressedSize(); } @@ -239,7 +159,7 @@ uint8_t* File::GetImageData() // If the decompression failed nothing can be done. return 0; } - + if ( HeaderInternal->HasLUT() && PixelConverter->BuildRGBImage() ) { return PixelConverter->GetRGB(); @@ -333,12 +253,14 @@ uint8_t* File::GetDecompressed() // The decompressed image migth not be loaded yet: std::ifstream* fp = HeaderInternal->OpenFile(); PixelConverter->ReadAndDecompressPixelData( fp ); - if(fp) HeaderInternal->CloseFile(); + if(fp) + HeaderInternal->CloseFile(); + decompressed = PixelConverter->GetDecompressed(); if ( ! decompressed ) { - dbg.Verbose(0, "File::GetDecompressed: read/decompress of " - "pixel data apparently went wrong."); + dbg.Verbose(0, "File::GetDecompressed: read/decompress of " + "pixel data apparently went wrong."); return 0; } } @@ -361,11 +283,9 @@ uint8_t* File::GetDecompressed() */ bool File::SetImageData(uint8_t* inData, size_t expectedSize) { - HeaderInternal->SetImageDataSize( expectedSize ); // FIXME : if already allocated, memory leak ! Pixel_Data = inData; - ImageDataSize = ImageDataSizeRaw = expectedSize; - PixelRead = 1; + ImageDataSize = expectedSize; // FIXME : 7fe0, 0010 IS NOT set ... return true; } @@ -456,6 +376,14 @@ bool File::Write(std::string const& fileName) return(false); } +/** + * \brief Access to the underlying \ref PixelConverter RGBA LUT + */ +uint8_t* File::GetLutRGBA() +{ + return PixelConverter->GetLutRGBA(); +} + //----------------------------------------------------------------------------- // Protected /** @@ -468,11 +396,6 @@ bool File::Write(std::string const& fileName) */ bool File::WriteBase (std::string const & fileName, FileType type) { -/* if ( PixelRead == -1 && type != ExplicitVR) - { - return false; - }*/ - std::ofstream* fp1 = new std::ofstream(fileName.c_str(), std::ios::out | std::ios::binary); if (fp1 == NULL) @@ -507,8 +430,12 @@ bool File::WriteBase (std::string const & fileName, FileType type) SetWriteToLibido(); }*/ // ----------------- End of Special Patch ---------------- - - HeaderInternal->Write(fp1, type); + + bool check=CheckWriteIntegrity(); + if(check) + { + HeaderInternal->Write(fp1,type); + } // -------------------------------------------------------------- // Special Patch to allow gdcm to re-write ACR-LibIDO formated images @@ -523,44 +450,59 @@ bool File::WriteBase (std::string const & fileName, FileType type) RestoreWrite(); - - fp1->close (); + fp1->close(); delete fp1; - return true; + return check; } /** - * \brief Access to the underlying \ref PixelConverter RGBA LUT - */ -uint8_t* File::GetLutRGBA() -{ - return PixelConverter->GetLutRGBA(); -} - -//----------------------------------------------------------------------------- -// Private -/** - * \brief Set the pixel datas in the good entry of the Header + * \brief Check the write integrity + * + * The tests made are : + * - verify the size of the image to write with the possible write + * when the user set an image data + * @return true if the check successfulls */ -void File::SetPixelData(uint8_t* data) +bool File::CheckWriteIntegrity() { - GetHeader()->SetEntryByNumber( GDCM_BINLOADED, - GetHeader()->GetGrPixel(), GetHeader()->GetNumPixel()); - - // Will be 7fe0, 0010 in standard case - DocEntry* currentEntry = GetHeader()->GetDocEntryByNumber(GetHeader()->GetGrPixel(), GetHeader()->GetNumPixel()); - if ( currentEntry ) + if(Pixel_Data) { - if ( BinEntry* binEntry = dynamic_cast(currentEntry) ) - // Flag is to false because datas are kept in the gdcmPixelConvert - binEntry->SetBinArea( data, false ); + switch(WriteMode) + { + case WMODE_NATIVE : + break; + case WMODE_DECOMPRESSED : + if(GetImageDataRawSize()!=ImageDataSize) + { + std::cerr<<"RAW : "<GetGrPixel(),GetHeader()->GetNumPixel()); + pixel->SetValue(GDCM_BINLOADED); + pixel->SetBinArea(Pixel_Data,false); + pixel->SetLength(ImageDataSize); + + Archive->Push(pixel); + } } void File::SetWriteToDecompressed() @@ -603,7 +545,7 @@ void File::SetWriteToDecompressed() void File::SetWriteToRGB() { - if(HeaderInternal->GetNumberOfScalarComponents()==3 && !HeaderInternal->HasLUT()) + if(HeaderInternal->GetNumberOfScalarComponents()==3) { PixelConverter->BuildRGBImage(); @@ -642,6 +584,14 @@ void File::SetWriteToRGB() Archive->Push(photInt); Archive->Push(pixel); + // Remove any LUT + Archive->Push(0x0028,0x1101); + Archive->Push(0x0028,0x1102); + Archive->Push(0x0028,0x1103); + Archive->Push(0x0028,0x1201); + Archive->Push(0x0028,0x1202); + Archive->Push(0x0028,0x1203); + // For old ACR-NEMA // Thus, we have a RGB image and the bits allocated = 24 and // samples per pixels = 1 (in the read file) @@ -681,6 +631,14 @@ void File::RestoreWrite() Archive->Restore(0x0028,0x0100); Archive->Restore(0x0028,0x0101); Archive->Restore(0x0028,0x0102); + + // For the LUT + Archive->Restore(0x0028,0x1101); + Archive->Restore(0x0028,0x1102); + Archive->Restore(0x0028,0x1103); + Archive->Restore(0x0028,0x1201); + Archive->Restore(0x0028,0x1202); + Archive->Restore(0x0028,0x1203); } void File::SetWriteToLibido() @@ -749,6 +707,26 @@ BinEntry* File::CopyBinEntry(uint16_t group,uint16_t element) return(newE); } +//----------------------------------------------------------------------------- +// Private +/** + * \brief Set the pixel datas in the good entry of the Header + */ +void File::SetPixelData(uint8_t* data) +{ + GetHeader()->SetEntryByNumber( GDCM_BINLOADED, + GetHeader()->GetGrPixel(), GetHeader()->GetNumPixel()); + + // Will be 7fe0, 0010 in standard case + DocEntry* currentEntry = GetHeader()->GetDocEntryByNumber(GetHeader()->GetGrPixel(), GetHeader()->GetNumPixel()); + if ( currentEntry ) + { + if ( BinEntry* binEntry = dynamic_cast(currentEntry) ) + // Flag is to false because datas are kept in the gdcmPixelConvert + binEntry->SetBinArea( data, false ); + } +} + //----------------------------------------------------------------------------- } // end namespace gdcm diff --git a/src/gdcmFile.h b/src/gdcmFile.h index 43b6f736..cf48b6d1 100644 --- a/src/gdcmFile.h +++ b/src/gdcmFile.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFile.h,v $ Language: C++ - Date: $Date: 2004/11/24 16:39:18 $ - Version: $Revision: 1.75 $ + Date: $Date: 2004/11/25 10:24:34 $ + Version: $Revision: 1.76 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -58,17 +58,15 @@ public: /// Accessor to \ref Header Header* GetHeader() { return HeaderInternal; } - /// Accessor to \ref ImageDataSize size_t GetImageDataSize(); - /// Accessor to \ref ImageDataSizeRaw - size_t GetImageDataSizeRaw(); + size_t GetImageDataRawSize(); /// Accessor to \ref PixelConverter PixelConvert* GetPixelConverter() { return PixelConverter; }; uint8_t* GetImageData(); - size_t GetImageDataIntoVector(void* destination, size_t maxSize); uint8_t* GetImageDataRaw(); + size_t GetImageDataIntoVector(void* destination, size_t maxSize); // see also Header::SetImageDataSize ?!? bool SetImageData (uint8_t* data, size_t expectedSize); @@ -106,6 +104,7 @@ public: protected: bool WriteBase(std::string const& fileName, FileType type); + bool CheckWriteIntegrity(); void SetWriteToNative(); void SetWriteToDecompressed(); @@ -121,13 +120,13 @@ protected: private: void Initialise(); - void SaveInitialValues(); // will belong to the future PixelData class uint8_t* GetDecompressed(); int ComputeDecompressedPixelDataSizeFromHeader(); -private: void SetPixelData(uint8_t* data); +private: + // members variables: /// Header to use to load the file @@ -158,11 +157,6 @@ private: /// \brief to hold the Pixels (when read) uint8_t* Pixel_Data; // (was PixelData) - /// \brief Size (in bytes) of required memory to hold the Gray Level pixels - /// represented in this file. This is used when the user DOESN'T want - /// the RGB pixels image when it's stored as a PALETTE COLOR image - size_t ImageDataSizeRaw; - /// \brief Size (in bytes) of requited memory to hold the the pixels /// of this image in it's RGB convertion either from: /// - Plane R, Plane G, Plane B @@ -170,14 +164,9 @@ private: /// - YBR Pixels (or from RGB Pixels, as well) size_t ImageDataSize; - /// \brief ==1 if GetImageDataRaw was used - /// ==0 if GetImageData was used - /// ==-1 if ImageData never read - int PixelRead; - // // --------------- end of future PixelData class -// +// }; } // end namespace gdcm diff --git a/src/gdcmPixelConvert.cxx b/src/gdcmPixelConvert.cxx index 05fe19d6..d3d6b7aa 100644 --- a/src/gdcmPixelConvert.cxx +++ b/src/gdcmPixelConvert.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmPixelConvert.cxx,v $ Language: C++ - Date: $Date: 2004/11/24 10:23:47 $ - Version: $Revision: 1.32 $ + Date: $Date: 2004/11/25 10:24:34 $ + Version: $Revision: 1.33 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -587,8 +587,11 @@ void PixelConvert::ConvertRGBPlanesToRGBPixels() bool PixelConvert::ReadAndDecompressPixelData( std::ifstream* fp ) { - ComputeDecompressedAndRGBSizes(); - AllocateDecompressed(); + // ComputeDecompressedAndRGBSizes is already made by + // ::GrabInformationsFromHeader. So, the structure sizes are + // correct + Squeeze(); + ////////////////////////////////////////////////// //// First stage: get our hands on the Pixel Data. if ( !fp ) @@ -606,6 +609,8 @@ bool PixelConvert::ReadAndDecompressPixelData( std::ifstream* fp ) return false; } + AllocateDecompressed(); + ////////////////////////////////////////////////// //// Second stage: read from disk dans decompress. if ( BitsAllocated == 12 ) @@ -771,7 +776,10 @@ void PixelConvert::ComputeDecompressedAndRGBSizes() { RGBSize = 3 * DecompressedSize; } - + else + { + RGBSize = DecompressedSize; + } } void PixelConvert::GrabInformationsFromHeader( Header* header ) @@ -867,7 +875,6 @@ void PixelConvert::GrabInformationsFromHeader( Header* header ) { dbg.Verbose(0, "PixelConvert::GrabInformationsFromHeader: " "unable to read red LUT data" ); - return; } } @@ -885,7 +892,6 @@ void PixelConvert::GrabInformationsFromHeader( Header* header ) { dbg.Verbose(0, "PixelConvert::GrabInformationsFromHeader: " "unable to read green LUT data" ); - return; } } @@ -903,12 +909,16 @@ void PixelConvert::GrabInformationsFromHeader( Header* header ) { dbg.Verbose(0, "PixelConvert::GrabInformationsFromHeader: " "unable to read blue LUT data" ); - return; } } } - if(fp) header->CloseFile(); + ComputeDecompressedAndRGBSizes(); + + if(fp) + { + header->CloseFile(); + } } /**